Linux系统编程-gcc

125 阅读2分钟

gcc编译的4步骤 口诀:ESc iso

  1. 预处理。hello.c->hello.i 展开宏和头文件,替换条件编译,删除空行空白注释 gcc -E
  2. 编译。hello.i->hello.s 检查语法,花费时间最长 gcc -S
  3. 汇编。hello.s->hello.o 汇编语言转成机器语言 gcc -c
  4. 链接。hello.o->可执行文件 gcc 无参数

这里每条指令都是执行到该步骤,比如gcc -c就是预处理、编译、汇编。
特别注意,-o不是链接,而是指定生成文件名的

gcc常用参数

  • -I 当头文件不在同一个目录时,需要指定头文件所在目录,相当于add_library的感觉
  • -g 允许可执行文件进行gbd调试
  • -D 注册宏,可以当作一个开关,程序里写没定义就不执行

静态库和动态库

  • 静态库:速度快,空间大,因为不运行时才链接,已经内嵌现在可执行文件里
  • 动态库:也叫共享库,速度慢,空间小,所有只有一份,运行时才链接,所以慢

库需要创建对应的头文件才符合使用规范

头文件守卫:防止头文件被重复包含

#ifndef _头文件名_H_
#define_头文件名_H_
...
函数声明
...
#endif

静态库

生成静态库

  1. 将.c文件生成.o文件
    gcc -c add.c -o add.o
  2. 使用ar工具制作静态库
    ar rcs lib库名.a add.o sub.o
  3. 链接时一起链接
    gcc test.c lib库名.a -o test

动态库

  1. 将.c文件生成.o文件
    gcc -c add.c -o add.o -fPIC
  2. 使用gcc -shared工具制作静态库
    gcc -shared -o lib库名.so add.o sub.o
  3. 链接时指定 -l:指定库名 -L:指定库路径,这里使用的是链接器。
    gcc test.c -o test -l 库名 -L 库路径
  4. 添加静态库环境变量,用于运行时动态链接器能找到,链接器和动态链接器可没关系嗷
    export DYLD_LIBRARY_PATH=库路径

gdb常用命令

  • list,显示代码。l 行号,如果接下来的l不指定行号,那他会每次自动往下显示
  • break,打断点。b 行号
  • run,执行。r
  • step,步入。s
  • next,越过函数。n
  • continue,程序继续执行
  • print,打印变量。p 变量名
  • quit,退出