Linux下C++编程(二)GCC编译器与GDB调试器
1. GCC编译器
1.1 编译过程
- 预处理-Pre-Processing
#-E 选项指示编译器仅对文件进行预处理
g++ -E test.cpp -o test.i // .i文件
- 编译-Compiling //.s文件
# -S 编译选项告诉 g++ 在为C++代码产生了汇编文件后停止编译
# g++产生的汇编语言文件的缺醒扩展名是 .s
g++ -S test.i -o test.s
- 汇编-Assembling //.o文件
# -c 选项告诉g++ 仅把源代码编译为机器语言的目标代码
# 缺醒时 g++ 建立的目标代码文件有一个.o的扩展名
g++ -c test.s -o test.o
- 链接-Linking //bin文件
# -o 编译选项来为将产生的可执行文件用指定的文件名
g++ test.o -o test
1.2 g++的重要参数
1.-g 编译带调试信息的可执行文件
#产生带调试信息的可执行文件
g++ -g test.cpp -o test
2.-O[n] 优化源代码
-O #同时减小代码的长度和执行时间,其效果等价于-O1
-O0 #表示不做优化
-O1 #默认优化
-O2 #除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。
-O3 #则包括循环展开和其他一些与处理特性相关的优化工作
#选项将使编译的速度比 使用-O时慢, 但通常产生的代码执行速度会更快
#使用-O2 优化源代码,并输出可执行文件速度会更快
g++ -O2 test.cpp
- -l和**-L**指定文件 | 指定库文件路径
# -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名
#在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接
#链接glog库
g++ -lglog 库
g++ -lglog test.cpp
#如果库文件 没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录
#-L参数跟着库文件所在目录
g++ -L/home/filename -lmytest test.cpp
- -I 指定头文件搜索目录
#/usr/include目录不用指定 其他文件可以借鉴下面例子指定
g++ -I/myinclude test.cpp
- -Wall 打印警告信息
#打印出gcc提供的警告信息
g++ -Wall test.cpp
- -w 关闭警告信息
#关闭所有警告信息
g++ -w test.cpp
- -std=c++11 设置编译标准
g++ -std=c++11 test.cpp
- -o 指定输出文件名
#指定即将产生的文件名
g++ test.cpp -o test
9.-D 定义宏
#在使用gcc/g++编译的时候定义宏
#常用场景:
# -DDEBUG 定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,勇哥DDEBUG来选择开启或关闭DEBUG
// -Dname定义宏name,默认定义内容为字符串"1"
#include<stdio.h>
int main()
{
#ifdef DEBUG //如果开启宏那么执行这里
printf(" DEBUG LOG\n");
#endif //如果没有执行那么执行这里
printf("in\n");
return 0;
}
//1. 在编译的时候,使用g++ -DDEBUG mian.cpp
//2. 那么 printf(" DEBUG LOG\n");代码将被执行
- man gcc 查看gcc英文操作手册手册
man gcc
1.3 g++命令行编译
1.直接编译,并运行
#将main.cpp scr/swap.cpp 编译为可执行文件
g++ main.cpp src/swap.cpp -Iinclude //-Iinclude指定编译器包含的自定义的头文件的路径
#运行a.out
./a.out
2.生成库文件并编译
链接静态库生成可执行文件:
#进入src目录下
cd src
#汇编,生成Swap.o文件
g++ swap.cpp -c -I../include
#生成静态库libswap.a
ar rs libswap.a swap.o
#返回到上一级目录
cd ..
#链接,生成可执行文件
g++ mian.cpp -I../include -lswap -Lsrc -o static_mian
#执行可执行文件
./static_main
链接动态库生成可执行文件
#进入src目录
cd src
#生成动态库 libSwap.so
g++ swap.cpp -I../incude -fPIC -shared -o libswap.so #-fPIC表示与路径无关
##上面ing零等价于以下两行命令
#gcc swap.cpp -I../include -c -fPIC
#gcc -shared -o libswap.so swap.o
#返回上级目录
cd ..
#链接生成可执行文件 sharemain
g++ main.cpp -Iinclude -Lsrc -lswap -o sharemain
#执行生成的可执行文件sharemain
./sharemain
- 运行可执行文件
运行可执行文件(链接静态库)
./static_main
运行可执行文件(链接动态库)
LD_LIBRARY_PATH=src ./share_main
2. GDB编译器
2.1常用调试命令参数
提示:编译程序时需要加参数 -g 生成的可执行文件才能被gdb调试,回车键是重复上一步命令。