g++ 常用参数总结
程序编译过程
程序的构建主要有4个阶段:预处理 ---> 编译 ---> 汇编 ---> 链接
1. 预处理: -E
g++ -E main.cpp -o main.ii
(参数 -E
表示只进行预处理)
这一步表示将源代码文件进行预处理,生成 .ii
文件(对.c
文件生成 .i
),预处理的结果,对源代码中以 "#" 开始的预编译指令进行处理,如:
- 扩展所有的宏定义,并将 "#define" 删除。
- 处理所有的条件编译指令,如 "#if, #ifdef, #endif"等等。
- 处理 "#include" 指令,将对应的头文件插入到对应的位置。
- 删除所有注释内容。
- 添加行号和文件标识。
- 保留所有的 "#pragma" 编译指令。
2. 编译:-S
g++ -S main.ii -o main.s
(参数 -S
表示进行编译,生成汇编文件)
如果 -S
后面的文件为 .cpp
文件,则该命令会先在背后调用预处理程序,然后再将预处理生成的.ii
文件生成汇编文件.s
,将预处理和编译合并起来,直接将源代码生成汇编代码:
g++ -S main.cpp -o main.s
3. 汇编:-c
g++ -c main.s -o main.o
(参数 -c
将汇编代码转变成机器可以执行的指令目标文件)
如果参数 -c
后面的文件为 .cpp
,则该指令会依次调用 预处理、 编译 来生成汇编代码、然后是进行 汇编 来生成机器可以执行的指令文件.o
。 所以 -c
参数指令是对 预处理、编译、汇编的包装,具体执行哪些过程,要看该参数后的文件。将 预处理、编译、汇编合并起来,直接将源代码生成 目标文件:
g++ -c main.cpp -o main.o
4. 链接
g++ main.o -o main.out
将目标文件链接成可执行程序 .out
文件(链接器程序为 ld
)。
g++
命令是对编译整个流程的包装,根据后面的源文件类型来决定调用哪些程序。如:
g++ main.cpp -o main.out
分别调用了 预处理、编译、汇编、链接 来将源文件生成可执行程序
g++ 的常用参数
5. -D
定义对应的宏
如 g++ main.cpp -DRELEASE -o main.out
中会定义宏 RELEASE
6. -I
用于编译时指定头文件的搜索路径
代码中使用了一些需要指定路径的头文件,如 #include "xxx.h"
需要在编译时指定其查找路径,否则编译时将报错无法找到对应的头文件。如:
g++ main.cpp -I"myProject/include" -o main.out
包含多个头文件路径需要依次使用 -I
来进行添加
7. -std
用来指示C++语言的标准版本
如使用 C++11标准进行编译: g++ main.cpp -o main.out -std=c++11
8. -L
:链接时需要查找库文件的路径
如链接时用到某个库,它位于 "/usr/myLib/dir/Libs"中,则:
g++ main.cpp -L"/usr/myLib/dir/Libs" -o main.out
9. -l
:用于链接库文件(link 的首字母)
如需要链接库文件 libmylib.so时,
g++ main.cpp -lmylib -o main.out
10. -include
:编译时在不修改代码的前提下,包含对应的头文件
如: g++ -include /usr/myHeaderFiles/tmp.h
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)