gcc编译的4步骤 口诀:ESc iso
- 预处理。hello.c->hello.i 展开宏和头文件,替换条件编译,删除空行空白注释
gcc -E - 编译。hello.i->hello.s 检查语法,花费时间最长
gcc -S - 汇编。hello.s->hello.o 汇编语言转成机器语言
gcc -c - 链接。hello.o->可执行文件
gcc 无参数
这里每条指令都是执行到该步骤,比如gcc -c就是预处理、编译、汇编。
特别注意,-o不是链接,而是指定生成文件名的
gcc常用参数
-I当头文件不在同一个目录时,需要指定头文件所在目录,相当于add_library的感觉-g允许可执行文件进行gbd调试-D注册宏,可以当作一个开关,程序里写没定义就不执行
静态库和动态库
- 静态库:速度快,空间大,因为不运行时才链接,已经内嵌现在可执行文件里
- 动态库:也叫共享库,速度慢,空间小,所有只有一份,运行时才链接,所以慢
库需要创建对应的头文件才符合使用规范
头文件守卫:防止头文件被重复包含
#ifndef _头文件名_H_
#define_头文件名_H_
...
函数声明
...
#endif
静态库
生成静态库
- 将.c文件生成.o文件
gcc -c add.c -o add.o - 使用ar工具制作静态库
ar rcs lib库名.a add.o sub.o - 链接时一起链接
gcc test.c lib库名.a -o test
动态库
- 将.c文件生成.o文件
gcc -c add.c -o add.o -fPIC - 使用gcc -shared工具制作静态库
gcc -shared -o lib库名.so add.o sub.o - 链接时指定
-l:指定库名 -L:指定库路径,这里使用的是链接器。
gcc test.c -o test -l 库名 -L 库路径 - 添加静态库环境变量,用于运行时动态链接器能找到,链接器和动态链接器可没关系嗷
export DYLD_LIBRARY_PATH=库路径
gdb常用命令
- list,显示代码。
l 行号,如果接下来的l不指定行号,那他会每次自动往下显示 - break,打断点。
b 行号 - run,执行。
r - step,步入。
s - next,越过函数。
n continue,程序继续执行- print,打印变量。
p 变量名 quit,退出