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