预处理
hello.c -> hello.i
gcc -E
展开宏、头文件,替换条件编译 删除注释空行空白
编译
hello.i -> hello.s
gcc -S
检查语法规范(消耗时间和系统资源最多)
汇编
hello.s -> hello.o
gcc -c
将汇编指令翻译成机器指令
二进制文件
链接
hello.o -> a.out
gcc
数据段合并,地址回填
-I
指定头文件所在位置
gcc -I 文件位置
-c
制作预处理、编译、汇编
-g
编译时添加调试文件,支持gdb调试
-Wall
显示所有警告信息
-D
向程序中动态注册宏定义
静态库
1、用.c生成.o文件
gcc -c test.c -o test.o
2、使用ar工具
ar acs lib库名.a add.o sub.o div1.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 div1.o
3、编译可执行程序时,指定所用的动态库 -l 指定库名 -L 指定库路径
gcc test.c -o a.out -l 库名 -L 库路径
4、运行可执行程序./a.out出错
原因:
链接器: 工作与链接阶段,工作时需要 -l 和 -L
动态链接器:工作与程序运行阶段,工作时需要提供动态库所在目录位置
通过环境变量:export LD_LIBRARY_PATH = 动态库路径
修改.bashrc文件 source .bashrc使其永久生效