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

Linux 环境下 C/C++ 编译流程详解,涵盖 GCC/G++ 安装、预处理、编译、汇编、链接四个核心阶段,并详细对比了静态库与动态库的区别、扩展名及适用场景。

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

运行以下命令安装 GCC:
sudo yum install gcc
安装完成后,可以再次检查版本:
gcc --version

运行以下命令安装 G++:
sudo yum install g++
安装完成后,可以再次检查版本:
g++ --version

C++代码执行
g++ -E code.cpp -o code.i # 生成预处理文件,生成.i 文件

编译器将预处理后的源代码转换为汇编代码(文本形式的机器指令)。
.s 文件)。g++ -S code.i -o code.s # 生成汇编文件,生成.s 文件

汇编器将汇编代码(.s 文件)转换为二进制的目标代码(.o 文件)。
.o 或 .obj 文件)。g++ -c code.s -o code.o # 生成目标文件,生成.o 文件
od filename # 可以进行查看

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

| 类型 | 描述 |
|---|---|
| 静态库 | 在编译时将库的代码嵌入到可执行文件中,生成的文件独立运行,不依赖外部库。 |
| 动态库 | 在运行时加载库文件,节省空间和内存,可以被多个程序共享。 |
动态库(Dynamic Library)是一种在运行时加载的库,可以被多个程序共享,以节省存储空间和内存。动态库的文件扩展名在不同操作系统中有所不同:
.so(Shared Object).dll(Dynamic Link Library).dylibldd # 可以查看可执行程序所依赖的动态库
下面是 code 可执行文件所依赖的动态库

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

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

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online