作者:嵌入式兔哥
简介:在嵌入式开发中,GCC 是我们最忠实的伙伴。很多兄弟可能只习惯用 IDE 的一键编译,但一旦转战 Linux 环境或编写 Makefile,理解 GCC 的这些参数就成了基本功。今天兔哥帮大家整理了一份“不求人”的 GCC 常用选项速查表,配合助记词,助你过目不忘!
| 类别 | 选项 | 助记(全称) | 作用 | 示例及解释 |
|---|---|---|---|---|
| 库与头文件用法 | -I | Include | 指定头文件的搜索路径。 告诉编译器去哪里找 .h文件。 | gcc main.c -I ./inc(解释:编译时额外在 ./inc目录寻找头文件) |
-l | library | 指定要链接的库名。 库名需去掉前缀 lib和后缀.so。 | gcc main.c -lpthread(解释:链接 libpthread.so线程库) | |
-L | Lib path | 指定库文件的搜索路径。 告诉编译器去哪里找 .so或.a文件。 | gcc main.c -L ./lib(解释:链接时额外在 ./lib目录寻找库文件) | |
| 编译流程 | -E | PrE-process | 只进行预处理,既不编译,也不汇编。 主要处理 #include、#define等。 | gcc -E main.c -o main.i(解释:生成 .i预处理文件,用于检查宏展开) |
-S | ASsembly | 只编译,不汇编。 将 C 代码转换为汇编代码。 | gcc -S main.c -o main.s(解释:生成 .s汇编文件,用于查看底层指令) | |
-c | compile | 编译并汇编,但不进行链接。 将汇编代码转换为机器码。 | gcc -c main.c -o main.o(解释:生成 .o目标文件,用于多文件编译) | |
-o | output | 小写字母“o”,指定生成的可执行文件的名字。 不指定的话生成的可执行文件名为 a.out。 | gcc main.c -o app(解释:生成名为 app的可执行文件) | |
| 调试与优化 | -g | Debug | 生成调试信息。 方便 GDB 或 VSCode 进行断点调试。 | gcc -g main.c -o app(解释:生成包含调试符号的程序,体积稍大) |
-O0~-O3 | Optimize | 指定优化等级。-O0不优化(调试用);-O2标准优化(发布用)。 | gcc -O2 main.c -o app(解释:使用 Level 2 级别优化代码性能) | |
-Wall | WarningAll | 开启所有警告。 强烈建议使用,能发现潜在 Bug。 | gcc -Wall main.c -o app(解释:打印出所有可能的代码警告信息) | |
| 嵌入式软件常用 | -D | Define | 定义宏。 等同于在代码里写 #define,常用于条件编译。 | gcc main.c -DDEBUG(解释:在命令行定义 DEBUG 宏,激活调试代码) |
-static | static | 静态链接。 把所有依赖库打入可执行文件,体积大但移植性好。 | gcc main.c -static -o app(解释:生成不依赖系统动态库的独立程序) | |
-nostdlib | no std lib | 不连接标准库。 不使用 glibc,用于编写 Bootloader 或裸机程序。 | gcc -nostdlib start.o ...(解释:仅链接指定文件,不引入标准 C 库) |
🐰 兔哥划重点
1.-I,-L,-l傻傻分不清楚?
这是新手最容易报错的地方。记住这个口诀:
头文件 (Include)找不到? 用
-I(大写 i) 指路。库文件 (Lib)在哪? 用
-L(大写 L) 指路。叫什么 (library)名字? 用
-l(小写 L) 点名。
注意:
-l后面跟的是库的缩写。
文件名:
libmath.so-> 选项:-lmath文件名:
libjpeg.a-> 选项:-ljpeg
2.-c和-o的黄金搭档
在编写Makefile时,我们通常不会直接gcc main.c -o app一步到位,而是分两步走,这样修改一个文件时,只需要重新编译那个文件即可,速度更快:
# 1. 先生成 .o (使用 -c) gcc -c main.c -o main.o gcc -c func.c -o func.o # 2. 最后链接 (不加 -c) gcc main.o func.o -o app3.-g和-O2能共存吗?
可以!-g主要是添加符号表,-O2是改变代码结构以优化性能。虽然可以共存,但在-O2优化后,GDB 调试时可能会发现代码跳跃执行(因为指令被重排了),建议开发阶段用-O0 -g,发布阶段用-O2。
如果觉得这篇速查表对你有帮助,欢迎点赞收藏,我是嵌入式兔哥,我们下期见!