C进阶养成记 - 养成记20:链接过程简介

--事物的难度远远低于对事物的恐惧! 

    在上节,我们分析了编译过程,编译完成后得到目标文件,而此时的目标文件并不能马上执行,还需要最后一步:链接。

    首先来思考一个问题:工程中的每个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、根据链接方式不同,链接过程可以分为:

        -静态链接:目标文件直接链接进入可执行程序

        -动态链接:在程序启动后才动态加载目标文件(工程中推荐的方式)

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/80030912