工程中的每个C语言源文件被编译后生产目标文件,这些文件如何生成最终的可执行程序?
链接器的意义:
链接器的主要作用是把各个模块之间相互引用的部分处理好,使得模块之间能够争取的衔接。
由链接器在链接时将库的内容直接加入到可执行程序中。
在Linux静态库下的创建和使用:
1)编译静态库源码:gcc –c lib.c –o lib.o (目标文件)
2)生成静态库文件:ar –q lib.a lib.o (打包)
3)使用静态库编译:gcc main.c lib.a –o main.out (lib.a相当于一个档案包,叫做静态库)
1)可执行程序在运行时才动态加载库进行链接;
2)库的内容不会进入可执行程序当中。
sub1和sub2是动态库暴露出来告诉编译器所能提供的内容(有用的部分)
在Linux动态库下的创建和使用:
1)编译动态库源码:gcc –shared dlib.c –o dlib.so (目标文件)
2)使用动态库编译:gcc main.c –ldl –o main.out
3)关键系统调用:
a> dlopen:打开动态库文件
b> dlsym:查找动态库中的函数并返回调用地址
c> dlclose:关闭动态库文件
小结:
1)链接是指将目标文件最终链接为可执行程序;
2)根据链接方式的不同,链接过程可以分为:
a> 静态链接:目标文件直接链接进入可执行程序;(适用于小程序)
b> 动态链接:在程序启动后才动态加载目标文件;(部分更新应用程序)