链接过程

问题

工程中的每个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\n",c);
	return 0;
}

动态链接

  • 编译动态库源码: gcc -shared dlib.c -o dlib.so

  • 使用动态库编译: gcc main.c -ldl -o main.out

  • 关键系统调用

    • dlopen : 打开动态库文件
    • dlsym : 查找动态库中的函数并返回调用地址
    • dlclose: 关闭动态库文件

小结

  • 链接是指将目标文件最终链接为可执行程序
  • 根据链接方式的不同,链接过程可以分为
    • 静态链接:目标文件直接链接进入可执行程序
    • 动态链接:在程序启动后才动态加载目标文件
posted @ 2018-06-22 14:01  烟云123  阅读(182)  评论(0)    收藏  举报