C语言编译链接简介

我们平时口中所说的编译器,是广泛的编译器。实际上,编译器包括了以下四个部分:

预处理器,编译器,汇编器,链接器

1.预编译

  • 处理include,展开被包含的文件
  • 将所有的#define 进行宏展开
  • 处理条件编译指令包括 #if , #ifdef, #elif , #else , #endif
  • 处理所有的注释,以空格代替
  • 保留编译器需要使用的 #pragma 指令
预编译指令示例:gcc -E hello.c -o hello.i

2.编译

  • 对预处理所得到的 .i 文件进行分析,同时进行代码优化生成相应的汇编代码文件

编译指令示例:gcc -S hello.i -o hello.s

3.汇编

  • 汇编将编译生成的汇编代码转化为机器可以执行的指令
汇编指令示例:gcc -c hello.s -o hello.o

4.链接

  • 链接又分静态链接和动态链接 
静态链接:
编译静态库:gcc -c hello.c -o hello.o
生成静态库文件:ar -q hello.a hello.o
链接使用静态库编译:gcc main.c hello.a -o main.out
动态链接:

代码段有
dlopen : 打开动态库文件,这个方法会将动态库加载到内存中
dlsysm:查找已经被加载到内存中的动态库中所需要的符号(函数或者变量),并返回找到函数的内存地址
dlclose:关闭动态库文件

编译
编译动态库:gcc -shared hello.c -o hello.so
链接使用动态库编译:gcc main.c -ldl -o main.out

 ./xxxx.out执行

过程大概是这样,欢迎补充!

猜你喜欢

转载自blog.csdn.net/Xavier52/article/details/109329585
今日推荐