编译流程
测试代码一
# test.c
#include <stdio.h>
int main(){
printf("hello world!\n");
return 0;
}
预处理
gcc -E test.c -o test.i
// -E 让gcc预处理后停止编译,test.i 为预处理后输出的文件
编译
- 将预处理后的代码编译成汇编代码。这一步会检查代码的规范性、是否有语法错误等
- 编译程序执行时,先分析,后综合。分析是指词法分析,语法分析,语义分析,和中间代码生成。综合,就是指代码优化和代码生成。
- 大部分的编译程序直接生成机器语言的目标代码,形成可执行的目标文件,也有的是先生成汇编语言一级的符号代码文件,再调用汇编程序进行翻译和加工处理,最后产生可执行的机器语言目标文件。
gcc -S test.i -o test.s
// -S 编译结束后停止编译,test.s为生成的汇编代码
汇编
汇编就是把编译阶段生成的.s文件转变成二进制目标代码,也就是机器代码
gcc -c test.s -o test.o
// -c 汇编结束后停止编译,test.o为生成的汇编代码
链接
链接就是将目标文件以及所需要的库文件链接生成可执行目标文件的过程
gcc test.o -o test
// 执行文件test
./test
测试代码二
# tools.h
int add (int a,int b);
# tools.c
#include tools.h
int add (int a,int b){
return a + b;
}
# test.c
#include <stdio.h>
#include "tools.h"
int main(){
int result = add(10,20);
printf("result = %d \n",result);
}
生成静态库
gcc -c tools.c
// 用ar命令将目标文件打包成静态库
ar rcs libtools.a tools.o
// 查看静态库中的内容
ar t libtools.a
// 生成执行文件 -L 链接 .当前文件夹 -ltools 链接的库文件
gcc -o test test.c -L. -ltools
生成动态库
gcc -c tools.c
// 生成动态库
gcc -shared -fPIC -o libtools.so tools.o
// 生成执行文件 -L 链接 .当前文件夹 -ltools 链接的库文件
gcc -o test test.c -L. -ltools