gcc以及gdb详解
一.gcc的编译参数
1.E
-E选项指示编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i //.i文件
2.S
-S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译
g++ -S test.i -o test.s
3.c
-c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
g++ -c test.s -o test.o
4 .o
-o 编译选项来为将产生的可执行文件用指定的文件名
g++ test.o -o test
5.g
-g 编译带调试信息的可执行文件,可以产生呗GDB使用的调试信息。
g++ -g test.cpp
6.o[n]
-O 同时减小代码的长度和执行时间,其效果等价于-O1
-O0 表示不做优化
-O1 为默认优化
-O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。
-O3 则包括循环展开和其他一些与处理特性相关的优化工作。
选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。
g++ -O2 test.cpp
7.-l(小写)
用来链接在/lib和/usr/lib和/usr/local/lib里的库
g++ -lglog test.cpp
8 -L
如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录
-L参数跟着的是库文件所在的目录名
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
9.-I(大写)
/usr/include目录一般是不用指定的,其他的就需要指定了。
g++ -I/myinclude test.cpp
10.Wall
打印gcc报错
gcc -Wall test.cpp
11.w.关闭警告信息
12-std=c++11 设置编译标准
13 -D 定义宏
二.gcc动静态库
目录结构
.
├── include
│ └── Swap.h
├── main.cpp
└── src
└── Swap.cpp
1. 生成静态库
g++ -c test.s -o test.o
## 进入src目录下
$cd src
# 汇编,生成Swap.o文件
g++ Swap.cpp -c -I../include
# 生成静态库libSwap.a
ar rs libSwap.a Swap.o
## 回到上级目录
$cd ..
# 链接,生成可执行文件:staticmain
g++ main.cpp -Iinclude -Lsrc -lSwap -o staticmain
2.生成动态库
g++ main.cpp -fPIC -share -o libmain.so
## 进入src目录下
$cd src
# 生成动态库libSwap.so
g++ Swap.cpp -I../include -fPIC -shared -o libSwap.so
## 上面命令等价于以下两条命令
# gcc Swap.cpp -I../include -c -fPIC
# gcc -shared -o libSwap.so Swap.o
## 回到上级目录
$cd ..
# 链接,生成可执行文件:sharemain
g++ main.cpp -Iinclude -Lsrc -lSwap -o sharemain
三.注意事项
1.执行动态库生成的执行程序时
LD_LIBRARY_PATH=sopath ./main
必须链接一下.so
四.gdb
1.调试开始:
执行gdb [exefilename]
2.参数:
$(gdb)help(h) # 查看命令帮助,具体命令查询在gdb中输入help + 命令
$(gdb)run® # 重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文
件)
$(gdb)start # 单步执行,运行程序,停在第一行执行语句
$(gdb)list(l) # 查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函
数)
$(gdb)set # 设置变量的值
$(gdb)next(n) # 单步调试(逐过程,函数直接执行)
$(gdb)step(s) # 单步调试(逐语句:跳入自定义函数内部执行)
$(gdb)backtrace(bt) # 查看函数的调用的栈帧和层级关系
$(gdb)frame(f) # 切换函数的栈帧
$(gdb)info(i) # 查看函数内部局部变量的数值
$(gdb)finish # 结束当前函数,返回到函数调用点
$(gdb)continue© # 继续运行
$(gdb)print§ # 打印值及地址
$(gdb)quit(q) # 退出gdb
$(gdb)break+num(b) # 在第num行设置断点
$(gdb)info breakpoints # 查看当前设置的所有断点
$(gdb)delete breakpoints num(d) # 删除第num个断点
$(gdb)display # 追踪查看具体变量值
$(gdb)undisplay # 取消追踪观察变量
$(gdb)watch # 被设置观察点的变量发生修改时,打印显示
$(gdb)i watch # 显示观察点
$(gdb)enable breakpoints # 启用断点
$(gdb)disable breakpoints # 禁用断点
$(gdb)x # 查看内存x/20xw 显示20个单元,16进制,4字节每单元
$(gdb)run argv[1] argv[2] # 调试时命令行传参
$(gdb)set follow-fork-mode child#Makefile项目管理:选择跟踪父子进程(fork())
回车键:重复上一命令