本文是基于唐佐林老师的课程的总结
工程中的每个c语言源文件被编译后生产目标文件,这些目标文件如何生成最终的可执行文件?
连接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接
图1
静态链接
-由链接器在链接时将库的内容直接加入到可执行程序中
图2
LINUX下静态库的创建和使用
-编译静态库源码:gcc -c lib.c -o lib.o
-生产静态库文件:ar -q lib.a lib.o
-使用静态库编译:gcc main.c lib.a -o main.out
这里是创建一个静态库
图3
图4
如图3和图4表示那样,我们将外部的slib.o、slib.c和dlib.c 删除掉,结果还是一样,由此我们可以得出结论,静态链接就是将所有的库文件生成的库文件全部封装到a.out里面去了。
动态链接
-可执行程序在运行时才动态加载库进行链接
-库的内容不会进入可执行文件程序当中
图5
LINUX下动态库的创建和使用
-编译动态库源码:gcc -shared dlib.c -o dlib.so
-使用动态库编译:gcc -main.c -ldl -o main.out
- 关键系统调用
(1)dlopen : 打开动态库文件
(2)dlsym : 查找动态库中的函数并返回调用地址
(3)dlclose : 关闭动态库文件
图6
dlopen是linux c的内容,大家对出现看不懂的话,推荐大家看一本书叫uinx环境高级编程。dlopen可以打开dlib.so的过程,就是将dlib.so加载到内存中。pdlib这个指针就指向那个动态库dlib.so,然后定义两个函数指针,然后判断pdlib指针是否为空,不为空的话,就证明动态库加载成功了,dlsym查找动态库dlib.so中的函数name,下一个如上,然后下面再判断是否真的找到两个函数,找到之后就调用函数。
图6
生成动态库dlib.so ps:这张图里面有一个错误,应该生成dlib.so
图7
编译程序要指明是动态链接,要不然程序会找不到相应的程序
图7
如图7,这是最后的结果
图8
如图8,将库文件删除后,就打不开库文件,说明一个问题,动态链接就是程序运行时,将库文件链接到程序当中。因此动态链接依赖动态库。
链接是指将目标文件最终链接到可执行程序
根据链接方式的不同,链接过程可以分为:
-静态链接:目标文件直接链接进入可执行程序
-动态链接:在程序启动后才动态加载目标文件
应用:动态链接可以部分更新程序,方便升级
静态链接适用于一些小程序,放在任何机器上都可以自由的运行