首页 > 代码库 > linux下的静态连接库和动态链接库

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文件;