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

个人主页:chian-ocean

文章专栏

前言:

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

Linux GCC or G++的安装

安装 GCC

运行以下命令安装 GCC:

bash 复制代码
sudo yum install -r gcc

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

bash 复制代码
gcc --version

安装G++

运行以下命令安装 GCC:

bash 复制代码
sudo yum install -r g++

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

bash 复制代码
g++ --version

Linux的代码编译

预处理(Preprocessing)

预处理的工作

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

C++代码执行

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

编译(Compilation)

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

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

汇编(Assembly)

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

  • 汇编代码被转换为机器能够理解的指令。
  • 生成目标文件(通常是 .o.obj 文件)。
bash 复制代码
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
bash 复制代码
ldd  #可以查看可执行程序所依赖的动态库

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

静态链接

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

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

动态VS静态

定义

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

操作系统命名

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

对比表

特性 静态链接 动态链接
生成的可执行文件大小 较大(嵌入所有库代码) 较小(仅包含对动态库的引用)
运行时依赖 无需外部库,独立运行 需要动态库文件
运行效率 高(无需加载外部库,直接执行) 稍低(运行时加载动态库)
内存使用 每个程序独立占用库的代码和数据 多个程序共享同一动态库
更新维护 更新库后需重新编译程序 更新库后程序无需重新编译
部署和兼容性 部署简单,无需额外的动态库 部署复杂,需要确保动态库存在并与程序兼容
符号冲突 不易出现,因为库代码独立嵌入到每个可执行文件中 可能出现多个库之间的符号冲突
和兼容性** 部署简单,无需额外的动态库 部署复杂,需要确保动态库存在并与程序兼容
符号冲突 不易出现,因为库代码独立嵌入到每个可执行文件中 可能出现多个库之间的符号冲突
适用场景 嵌入式系统、小型独立工具、运行环境固定的场景 大型系统、需要频繁更新库或共享库的场景
相关推荐
厂太_STAB_丝针18 分钟前
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
c语言·单片机·嵌入式硬件
我不是代码教父1 小时前
[原创](Modern C++)现代C++的关键性概念: 流格式化
c++·字符串格式化·流格式化·cout格式化
利刃大大2 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
charlie1145141912 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
子燕若水2 小时前
mac 手工安装OpenSSL 3.4.0
c++
*TQK*2 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
ElseWhereR3 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法
*TQK*3 小时前
ZZNUOJ(C/C++)基础练习1031——1040(详解版)
c语言·c++·编程知识点
※DX3906※4 小时前
cpp实战项目—string类的模拟实现
开发语言·c++
深度Linux4 小时前
Linux网络编程中的零拷贝:提升性能的秘密武器
linux·linux内核·零拷贝技术