问题
工程中的每个c语言源文件被编译后生成目标文件,这些目标文件如何生成最终的可执行文件?
链接器的意义
链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块能够正确的衔接
模块链接
静态链接
由链接器在链接时将库的内容直接加入到可执行程序中
Linux下静态库的创建和使用
- 编译静态库源码: gcc -c lib.c -o lib.o
- 生成静态库文件: ar -q lib.a lib.o
- 使用静态库编译:gcc main.c lib.a -o main.out
例子1:静态库链接
slib.c
int add(int x,int y);
main.c
#include<stdio.h>
extern int add(int x,int y);
int main()
{
int a = 2;
int b = 3;
int c = add(a,b);
printf("c = %d
",c);
return 0;
}
动态链接
-
编译动态库源码: gcc -shared dlib.c -o dlib.so
-
使用动态库编译: gcc main.c -ldl -o main.out
-
关键系统调用
- dlopen : 打开动态库文件
- dlsym : 查找动态库中的函数并返回调用地址
- dlclose: 关闭动态库文件
小结
- 链接是指将目标文件最终链接为可执行程序
- 根据链接方式的不同,链接过程可以分为
- 静态链接:目标文件直接链接进入可执行程序
- 动态链接:在程序启动后才动态加载目标文件