GCC编译器
注:在实际开发中,使用gcc指令编译C程序,使用g++指令编译C++程序。
例:g++ test.cpp -o test //下面对编译过程进行详解
一、编译过程:
1. 预处理 // .i文件
# -E 选项使编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i
2. 编译 //.s文件
# -S 编译选项使g++为C++代码产生汇编语言文件后停止编译
g++ -S test.i -o test.s
3. 汇编 //.o文件
# -C 选项使g++仅把源代码编译为机器语言的目标代码
g++ -c test.s -o test.o
4. 链接 //bin文件
# -O 选项为将产生的可执行文件指定文件名
g++ test.o -o test
二、g++常用编译参数
1. -g 编译带调试信息的可执行文件
# -g 使GCC产生能被GNU调试器使用的调试信息
g++ -g test.cpp -o test
2. -O[n] 优化源码
# -O1 默认有优化,减小代码的长度和执行时间
# -O2 在O1基础上添加额外的调整,如指令调整(常用)
# -O3 包括循环展开和其他与处理特性相关的优化
g++ test.cpp -O2 -o test
3. -l 指定库文件 & -L 制定库文件路径
# -l用来指定程序要连接的库
# 在 /lib 和 /usr/lib 和 /usr/local/lib 中的库文件直接用-l即可链接
g++ -lglog test.cpp
# 库文件不在以上目录中需要使用-L制定所在目录
# 连接lmytest库,lmytest.so 在/home/bing/mytestfolder 目录下
g++ -L/home/bing/mytestfolder -lmytest test.cpp
4. -I 指定头文件搜索目录
# /usr/include 目录通常无需指定,当头文件不在此路径下时才使用-I参数,例如头文件在/myinclude路径
g++ -I/myinclude test.cpp
5. -Wall 打印警告信息 & -w 关闭警告信息
# g++ -Wall test.cpp
# g++ -w test.cpp
6. -std=c++11 设置编译标准
# 使用 c++11 编译
g++ -std=c++11 test.cpp
7. -o 指定输出文件名
# 默认生成 a.out,指定后为test
g++ test.cpp -o test
8. -D 定义宏
# 常用场景 -DDEBUG宏
# c语言示例代码如下:
int main()
{
#ifndef DEBUG
printf("DEBUG LOG\n");
#endif
printf("in\n");
}
# 编译:gcc -DDEBUG main.cpp
GDB调试器
注:vscode通过调用GDB实现 C/C++ 的调试,在编译程序时需要加 -g 才能使用 GDB 调试 gcc -g main.c -o main
一、常用调试命令参数
调试开始执行 gdb filename 进入调试程序,filename为可执行文件名
### 括号内为简化使用 ###
help(h) #查看命令帮助
run(r) #重新开始运行文件
start #单步执行运行程序,停在第一行执行语句
list(l) #查看源代码(list-n 从第n行开始查看代码,list+函数名 查看具体函数)
next(n) #单步调试(按过程,函数直接执行)
step(s) #单步调试(按语句,进入函数内部)