--事物的难度远远低于对事物的恐惧!
在上节,我们分析了编译过程,编译完成后得到目标文件,而此时的目标文件并不能马上执行,还需要最后一步:链接。
首先来思考一个问题:工程中的每个C语言源文件被编译后生成的目标文件,这些目标文件如何生成最终的可执行程序?
这就需要这节我们将要分析链接器。
链接器:
链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。
链接又分为静态链接和动态链接
静态链接:
-由链接器在链接时将库中的内容直接加入到可执行程序中
-优点:可执行程序的执行可脱离库文件直接运行
-缺点:每次软件的升级,都需要重新编译链接整个工程
linux下创建和使用静态链接库的步骤如下:
-编译静态库源码:gcc -c lib.c -o lib.o
-生成静态库文件:ar -q lib.a lib.o
-使用静态库编译:gcc main.c lib.a -o main.out
动态链接:
-可执行程序在运行时才动态加载库进行链接
-库的内容不会进入可执行程序中
优点:软件升级时只需要单独编译动态库源文件,并将生成的动态库替换掉原来的动态库即可,不需要重新编译整个工程
缺点:因为是运行时才动态加载库,所执行效率会比静态链接低些
Linux下动态库的创建和使用
-编译动态库源码:gcc -share dlib.c -o dlib.so
-使用动态库编译:gcc main.c -ldl -o main.out
-关键系统调用
-dlopen:打开动态库文件
-dlsym:查找动态库中的函数并返回调用地址
-dlclose:关闭动态库文件
总结:
1、链接是指将目标文件最终链接为可执行程序
2、根据链接方式不同,链接过程可以分为:
-静态链接:目标文件直接链接进入可执行程序
-动态链接:在程序启动后才动态加载目标文件(工程中推荐的方式)