以下 GCC 编译命令,涵盖常见用法,适用于 C/C++ 项目开发。
1. 基础编译命令
(1)编译单个源文件
gcc hello.c -o hello # 编译 hello.c,生成可执行文件 hello
-o:指定输出文件名(默认生成a.out)。
(2)编译并运行
gcc hello.c -o hello && ./hello # 编译后立即执行
2. 分步编译(预处理、汇编、链接)
(1)预处理(生成 .i 文件)
gcc -E hello.c -o hello.i # 展开宏和头文件
(2)生成汇编代码(.s 文件)
gcc -S hello.i -o hello.s # 生成汇编代码
(3)生成目标文件(.o 文件)
gcc -c hello.s -o hello.o # 生成二进制目标文件
(4)链接为可执行文件
gcc hello.o -o hello # 链接目标文件
3. 多文件编译
(1)直接编译多个文件
gcc main.c utils.c -o program # 编译并链接多个源文件
(2)先生成目标文件再链接
gcc -c main.c -o main.o # 编译 main.c
gcc -c utils.c -o utils.o # 编译 utils.c
gcc main.o utils.o -o program # 链接所有目标文件
4. 常用编译选项
|
选项 |
作用 |
|
|
启用所有警告(推荐始终使用) |
|
|
将警告视为错误 |
|
|
优化级别( |
|
|
添加调试信息(用于 GDB) |
|
|
指定头文件搜索路径(如 |
|
|
指定库文件搜索路径(如 |
|
|
链接动态库(如 |
|
|
强制静态链接 |
|
|
定义宏(如 |
|
|
指定 C 标准(如 |
详细解释如下:
(1)基础编译选项
|
选项 |
作用 |
|
|
编译 (默认生成 |
|
|
仅执行预处理,不编译和连接 输出到屏幕(可结合 |
|
|
仅编译,不组装和连接,生成汇编代码( |
|
|
只编译和组装,不链接, 生成 |
|
|
显示详细的编译过程(调试时有用) |
|
|
将输出放到 <文件>中 |
(2)警告控制选项
|
选项 |
作用 |
|
|
启用所有常见警告(推荐始终使用) |
|
|
启用额外警告(比 |
|
|
将警告视为错误(强制解决所有警告) |
|
|
忽略特定警告(如 |
(3)优化选项
|
选项 |
作用 |
|
|
禁用优化(默认,适合调试) |
|
|
基础优化(平衡速度和大小) |
|
|
推荐优化级别(提高性能,不影响可调试性) |
|
|
激进优化(可能增加代码体积) |
|
|
优化代码大小(嵌入式系统常用) |
|
|
链接时优化(跨文件优化,需在编译和链接时都启用) |
(4)调试选项
|
选项 |
作用 |
|
|
生成调试信息(用于 GDB) |
|
|
生成更详细的 GDB 调试信息 |
|
|
包含宏定义等额外调试信息 |
|
|
保留栈帧指针(方便调试) |
(5)头文件与库路径
|
选项 |
作用 |
|
|
添加头文件搜索路径(如 |
|
|
添加库文件搜索路径(如 |
|
|
链接动态库(如 |
|
|
强制静态链接(所有库静态编译进可执行文件) |
|
|
生成动态库( |
|
|
生成位置无关代码(编译动态库时必需) |
(6)语言标准控制
|
选项 |
作用 |
|
|
指定 C 标准(如 |
|
|
指定 C++ 标准(如 |
|
|
严格遵循 ANSI C 标准(相当于 |
(7)其他实用选项
|
选项 |
作用 |
|
|
定义宏(如 |
|
|
取消宏定义 |
|
|
生成依赖关系(用于 Makefile, |
|
|
启用 POSIX 线程支持(比 |
|
|
禁用栈保护(安全研究时可能用到) |
5. 静态库与动态库
(1)静态库(.a)
# 生成目标文件
gcc -c lib.c -o lib.o
# 打包为静态库
ar rcs libfoo.a lib.o
# 使用静态库
gcc main.c -L. -lfoo -o main
(2)动态库(.so)
# 生成动态库(-fPIC 生成位置无关代码)
gcc -shared -fPIC lib.c -o libfoo.so
# 使用动态库(需设置 LD_LIBRARY_PATH)
gcc main.c -L. -lfoo -o main
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
6. 调试与优化
(1)使用 GDB 调试
gcc -g program.c -o program # 编译时添加调试信息
gdb ./program # 启动 GDB
(2)优化代码
gcc -O2 program.c -o program # 启用 O2 优化
7. 高级用法
(1)交叉编译
# 示例:编译 ARM 架构程序
arm-linux-gnueabi-gcc program.c -o program_arm
(2)生成依赖文件(Makefile 辅助)
gcc -MM main.c # 输出 main.o 的依赖关系
8. 完整示例
(1)编译多文件项目
gcc -Wall -O2 -I./include main.c src/utils.c -L./lib -lfoo -o program
(2)带调试信息的静态链接
gcc -g -static main.c -o program_debug
9. 常见问题
(1)undefined reference to 错误
- 原因:缺少库或未链接目标文件。
- 解决:检查
-l和-L参数是否正确。
(2)header not found 错误
- 解决:使用
-I指定头文件路径。
(3)兼容性问题
- 指定标准:
-std=c11或-std=gnu11(C),-std=c++17(C++)。
总结
- 基础流程:
gcc source.c -o output - 多文件:先编译
.o,再链接。 - 库管理:静态库用
ar,动态库用-shared -fPIC。 - 调试:
-g+GDB,优化用-O2。

7034

被折叠的 条评论
为什么被折叠?



