gcc编译的四个阶段
hello.cpp--预处理器(cpp gcc -E)-->hello.i--编译器(gcc gcc -S)-->hello.s--汇编器(as gcc -c)-->hello.o--连接器(ld gcc)-->可执行文件
gcc的参数
gcc x.c -o name 输出name可执行文件
gcc x.c -I 头文件路径 指定头文件路径
gcc x.c -D 宏 指定宏
gcc x.c -O 是否优化程序
gcc x.c -Wall 更多警告信息
gcc x.c -g 包含调试信息
静态库的使用
静态库命名规则
lib+库名+.a
制作静态库文件
1. 生成对应的.o文件 -------------》 gcc -c
2. 将生成的.o文件打包 ar rcs+静态库文件+ .o文件
静态库的优缺点
nm x.a 查看。a文件的内容
优点:
1.发布程序不需要提供对应的库
2.加载库的速度较快
缺点:
1.库被打包到应用程序中,导致库的体积很大
2.库发生改变,需要重新改变编译
动态库的使用
动态库的命名规则
lib+k库名+.so
制作动态库
1.生成与位置无关的。o文件 ----------------------> gcc -fPIC -c *.c
2.将.o文件打包 gcc -shared -o 库名 .o文件
使用方式 gcc x.c -L库路径 -l库名
ldd app 执行程序所依赖的执行库
解决动态库链接问题 export LD_LIBRARY_PATH=./lib
/etc/ld.so.conf
ldconfig -v
动态库的优缺点
优点:
1.执行体积小
2、更新简单
缺点:
1.需要把动态库提供给用户
2.动态库没有打包到程序中,加载速度慢
GDB调试
1.启动GDB
命令 gdb app
2.查看程序源代码
命令 l 文件名:行数/函数
3.设置断点
命令 break 行数 if 条件
4.断点信息
命令 info break
5.下一行
命令 n
6.继续执行,直到下一断点
命令 c
7.查看变量值
命令 p 变量名
8.查看变量属性
命令 ptype 变量名
9.追踪变量的值
命令 display 变量名
10.获取追踪信息
命令 info display
11.删除追踪
命令 undisplay 行号
12.跳出单次循环,不执行
命令 u
13.跳出当前函数
命令 finish
14.删除断点
命令 del 编号
15.设置变量值
命令 set var 变量=值
17只执行一步
命令 start
18.单步
命令 s
19.退出GDB
命令 quit
makefile的编写
命名方式:makefile/Makefile
编写规则:
三要素:目标,依赖,命令
目标:依赖条件
命令
工作原理
向下检索,构建依赖树,向上执行命令,最终目标文件