• linux下的静态连接库和动态链接库


    对linux的静态连接库和动态链接库分不清楚,在看了一篇博文后,现在想做个自己的总结,以加深印象:

    1、库的基本概念:

    库是可执行代码的二进制形式,其可以被调入操作系统调入内存进行执行。

    在window和linux系统,都存在各自的库,但是两种系统的库并不能兼容,因为它们的编译器,连接器,汇编器都是不相同的。

    在windows下,静态连接库的后缀是.lib;动态链接库的后缀是.dll

    在linux系统下,静态链接库的后缀是.a;动态链接库的后缀是.so

    2、静态连接库和动态链接库的命名:

      静态连接库:libxxxx.a

          以lib为前缀,紧接着跟静态库名xxxx(可以自己起),后缀是.a

      动态链接库:libxxxxx.so

          以lib为前缀,紧接着跟动态库名xxxx(可以自己起),后缀是.so

             动态链接库的名字还会有:libxxxxx.so.major.minor   major指的是动态库的主版本号; minor指的是动态库的副版本号

    2、静态链接库和动态连接库的比较:

    1)在于代码运行时载入内存的时候不同;程序在编译连接的时候,静态链接库的副本是需要载入内存的,并且当多个程序都设计到同一个静态连接库时,会在内存中存在多个副   本;

      动态链接库只有程序在运行的时候,才会载入到内存,而在编译连接时,只是提供了动态链接库的引用(理解为路径)。

    2)静态库的代码在编译的过程中已经被载入可执行程序,所以体积比较大;

      动态库在在运行的时候才载入内存,在编译编译过程中只是引用,所以代码体积比较小。

    3、为什么需要库的存在

      库是已经现有的,成熟的,可以复用的代码。在程序中可以直接引用,而减少工作量。

    4、在linux系统下,如何产生静态库和动态库

      不管是静态库还是动态库,它们的产生都分为两步:

      第一步:有源文件编译成目标文件,后缀是.o

      第二步:根据动态或者静态库各自的命令,生成库

      4.1 静态库

        第一步:gcc -c jia.c     //生成一个jia.o的目标文件

        第二步:ar rcs libjia.a hello.o    //生成静态链接库libjia.a

      4.2动态库

        第一步:gcc -c jia.c   //生成一个jia.o的目标文件

        第二步:gcc -shared -fPIC -o  libjia.so jia.o  //生成一个动态库libjia.so

    5、静态库和动态库的搜索路径和顺序:

      不管是动态库还是静态库都是有连接器ld进行寻找

      5.1 静态连接库:

        1)找gcc命令中参数指定的位置-L

        2)静态环境变量LIBRARY_PATH指定的搜索路径;

        3)默认的静态库的搜索路径/lib

        4)默认的静态库的搜索路径/usr/lib

      5.2 动态链接库:

        1)gcc命令中指定的动态库的搜索路径;

        2)环境变量LID_LIBRARY_PATH指定的搜索路径;

        3)配置文件/etc/ld.so.conf中指定的动态库的搜索路径;

        4)默认的动态库的搜索路径/lib;

        5)默认的动态库的搜索路径/usr/lib;

    6、新安装一个库,如何使系统能够找到它

      如果安装在/lib或者/usr/lib下,那么默认连接器ld可以找到,不需要其他的操作;

      如果安装在其他的目录下,需要将其添加到/etc/ld.so.cache文件中,步骤如下:

      第一步:编辑/etc/ld.so.conf文件,加入库文件所在的目录的路径;

      第二步:运行ldconfig,该命令会重建/etc/ld.so.cache文件;

  • 相关阅读:
    【转】win32内核程序中进程的pid,handle,eprocess之间相互转换的方法
    (ring0)Windows内核根据PID获取进程全路径
    Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)
    指向API的函数指针定义方法
    ListCtrl列表控件设置到指定位置(自滚动,该特性支持虚拟列表)
    【转】VS设置符号表
    物联网三层架构
    五种测试的区别
    CMMI将能力成熟度分为5个级别
    软件的4种维护(更正性、完善性、预防性、适应性)的区别
  • 原文地址:https://www.cnblogs.com/ccnp/p/3864045.html
Copyright © 2020-2023  润新知