- 静态库
静态库不是一整个文件。而是一些.o文件的集合。
链接器在链接静态链接库的时候是以目标文件(.o)为单位的,如果该静态库里的某些方法没有任何地方调用,则这些没有被调用到的方法或变量将会被丢弃掉,不会被链接到目标程序中,这样做可以大大减小生成二进制文件的体积。 - 动态库
在程序的链接阶段时,链接器只是拷贝了一些重定位和符号信息。在程序加载(execve)时才会解析so文件中代码和数据的引用。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须使用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址无关代码(Position Independent Code (PIC))。 - 库的优先级
linux下进行连接的缺省操作是首先连接动态库 - 库的搜索路径
- Linux
1、编译链接库时的搜索路径顺序(.a和.so)
(1)-L选项指定的目录,例如:g++ -o test_fun test_fun.c -L. -lfun
(2)-Wl,rpath指定的目录。例如:gcc -o foo foo.c -L. -lfoo -Wl,-rpath=./
(3)环境变量LD_LIBRARY_PATH中设置的目录。
(4)/etc/ld.so.cache文件中缓存的文件位置。
(5)默认的/usr/lib或者/usr/lib64。
2、程序运行时搜索动态库文件的顺序(.so)
(1)-Wl,rpath指定的目录。例如:gcc -o foo foo.c -L. -lfoo -Wl,-rpath=./
(2)环境变量LD_LIBRARY_PATH中设置的目录。
(3)/etc/ld.so.cache文件中缓存的文件位置。
(4)默认的/usr/lib或者/usr/lib64。 - Windows
1、动态库搜索路径
(1)应用程序所在目录
(2)当前目录
(3)Windows SYSTEM目录
(4)Windows目录
(5)PATH环境变量指定的路径
- Linux
参考:
Linux部分 14、静态和动态链接、环境变量