当前位置: 首页 > article >正文

从零开始:Linux 环境下的 C/C++ 编译教程

个人主页:chian-ocean

文章专栏

前言:

GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C++。其中 gcc 用于 C 语言编译,g++ 专用于 C++ 编译。

在这里插入图片描述

Linux GCC or G++的安装

安装 GCC

运行以下命令安装 GCC:

sudo yum install -r gcc

安装完成后,可以再次检查版本:

gcc --version

在这里插入图片描述

安装G++

运行以下命令安装 GCC:

sudo yum install -r g++

安装完成后,可以再次检查版本:

g++ --version

在这里插入图片描述

Linux的代码编译

预处理(Preprocessing)

预处理的工作

  • 去掉注释
  • 展开头文件
  • 条件编译
  • 宏替换

C++代码执行

g++ -E code.cpp -o code.i 
# 可以生成与处理文件,生成.i文件

在这里插入图片描述

编译(Compilation)

编译器将预处理后的源代码转换为汇编代码(文本形式的机器指令)。

  • 生成汇编代码(通常是 .s 文件)。
  • 编译器会进行语法分析和语义检查。
g++ -S code.i -o code.s
# 可以生成与处理文件,生成.s文件

在这里插入图片描述

汇编(Assembly)

汇编器将汇编代码(.s 文件)转换为二进制的目标代码(.o 文件)。

  • 汇编代码被转换为机器能够理解的指令。
  • 生成目标文件(通常是 .o.obj 文件)。
g++ -E code.s -o code.0
# 可以生成与处理文件,生成.0文件
od filename # 可以进行查看

在这里插入图片描述

链接(Linking)

函数库(Library)简介

在编程中,函数库是指封装了一组可重用函数、类或其他代码模块的集合,目的是简化开发、提高代码复用性。函数库通常以静态库(*.a*.lib)或动态库(*.so*.dll*.dylib)的形式存在。

在这里插入图片描述

类型描述
静态库在编译时将库的代码嵌入到可执行文件中,生成的文件独立运行,不依赖外部库。
动态库在运行时加载库文件,节省空间和内存,可以被多个程序共享。

动态链接

动态库(Dynamic Library)是一种在运行时加载的库,可以被多个程序共享,以节省存储空间和内存。动态库的文件扩展名在不同操作系统中有所不同:

  • Linux: .so(Shared Object)
  • Windows: .dll(Dynamic Link Library)
  • macOS: .dylib
ldd  #可以查看可执行程序所依赖的动态库

下面是code可执行文件所以来的动态库

在这里插入图片描述

静态链接

静态库是一种将一组目标文件(.o 文件)打包成单个文件(通常扩展名为 .a.lib)的技术,便于代码复用。静态库在编译时链接到可执行文件中,因此运行时不需要额外的库支持。

  • Linux: .a
  • Windows: .lib
g++ code.cpp -static -o code-static # 可以生成静态链接

在这里插入图片描述

动态VS静态

定义

链接方式定义
静态链接在编译阶段,将所需库的代码嵌入到可执行文件中,生成一个独立的可执行文件。
动态链接在运行时加载所需的库(动态库),可执行文件只包含对库的符号引用,库本身存储在外部文件中(如 .so)。

操作系统命名

操作系统静态库扩展名动态库扩展名
Linux.a.so
Windows.lib.dll
macOS.a.dylib

对比表

特性静态链接动态链接
生成的可执行文件大小较大(嵌入所有库代码)较小(仅包含对动态库的引用)
运行时依赖无需外部库,独立运行需要动态库文件
运行效率高(无需加载外部库,直接执行)稍低(运行时加载动态库)
内存使用每个程序独立占用库的代码和数据多个程序共享同一动态库
更新维护更新库后需重新编译程序更新库后程序无需重新编译
部署和兼容性部署简单,无需额外的动态库部署复杂,需要确保动态库存在并与程序兼容
符号冲突不易出现,因为库代码独立嵌入到每个可执行文件中可能出现多个库之间的符号冲突
和兼容性**部署简单,无需额外的动态库部署复杂,需要确保动态库存在并与程序兼容
符号冲突不易出现,因为库代码独立嵌入到每个可执行文件中可能出现多个库之间的符号冲突
适用场景嵌入式系统、小型独立工具、运行环境固定的场景大型系统、需要频繁更新库或共享库的场景

http://www.kler.cn/a/410976.html

相关文章:

  • 蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、异或三角:::非常典型的必刷例题!!!)
  • R和Julia免疫细胞映射到组织切片
  • 拥抱极简主义前端开发:NoCss.js 引领无 CSS 编程潮流
  • 【大数据学习 | Spark-Core】Spark的改变分区的算子
  • 数据新时代:如何选择现代数据治理平台(上)
  • python学习笔记(12)算法(5)迭代与递归
  • 智慧公厕解决方案-城市公厕更智能、更干净
  • Lua--1.基础知识
  • 学习threejs,使用设置lightMap光照贴图创建阴影效果
  • QT QRadioButton控件 全面详解
  • 【西瓜书】剪枝与样本值处理——预剪枝、后剪枝、连续值、缺失值
  • python深度学习机器学习编程序接单服务代码指导编写脚本调试爬虫
  • docker 通过Dockerfile自定义的镜像部署Springboot项目
  • 一个专为云原生环境设计的高性能分布式文件系统
  • C嘎嘎探索篇:栈与队列的交响:C++中的结构艺术
  • 华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座
  • QML学习 —— 34、视频媒体播放器(附源码)
  • 8K超高清相机+双光谱融合技术
  • 二代三代社保卡读卡器串口命令协议,适用于单片机等嵌入式系统使用
  • WordCloud参数的用法:
  • 【VRChat 全身动捕】VIVE 手柄改 tracker 定位器教程,低成本光学动捕解决方案(持续更新中2024.11.26)
  • docker如何安装mysql8
  • 香橙派--安装RKMPP、x264、libdrm、FFmpeg(支持rkmpp)以及opencv(支持带rkmpp的ffmpeg)(适用于RK3588平台)
  • C语言数据结构学习:循环队列
  • GreatSQL 运行时内存太高,超过90%怎么办
  • 带有悬浮窗功能的Android应用