动态库的搜索

上头需要把项目从windows系统移动到linux下,作为对linux半吊子的我却无意承担了这个工作,从此填坑深如海。原项目实在MSVC+Qt开发的,还好Qt是跨平台的,但是windows和linux的运行还是有所差距的。以下记录linux下动态库的搜索路径,多数内容来自CSDN中的其他大神。

编译时链接

这个过程是由ld程序来执行的,所以编译时找不到动态库的位置的话,经常就会看到这种错误:
在这里插入图片描述
这个过程严格意义上来说并不能说是链接,因为在这里ld-linux程序并没有真正的把库里面的函数的执行代码写到可执行文件里面,只是把一些符号还有其他的必要信息写道了可执行文件里面,供可执行文件运行时查找。
总的来说,ld-linux程序在这一步里面就是做了两个事情:
1.查找动态库中是否含有我们需要的符号(函数和全局变量),如果都能找到,则链接允许通过,生成了可执行文件。
2. 在可执行文件中写入了符号和其他必要的信息(例如符号的地址),供可执行文件运行时查找。

ld-linux编译时搜索动态库路径

(1)ld-linux.so.6由gcc的spec文件中所设定
(2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
(3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib
(4)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看)
(5)二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin
(6)编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include

运行时链接

这个过程是由ld-linux程序来执行,这个才是真正的链接。它所做的工作就是将动态库的代码映射到进程(可执行文件运行起来就是进程啦…)的虚拟地址空间中,供进程来调用。

运行时动态库搜索顺序

(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib
(3)LD_LIBRARY_PATH环境变量中所设定的路径 ,使用Qt时QtCreator会自动根据项目pro文件中的配置将所需的动态库路径加入该环境变量,但这只在QtCreator中可见,即实际环境中并不存在该路径。在具体见

(4)/etc/ld.so.conf.d/libc.config(或/usr/local/etc/ld.so.conf)中所指定的路径,并由ldconfig命令生成二进制的ld.so.cache以更新配置

几点注意

(1)在QtCreator的pro配置文件中不可显示将/usr/include作为所需库头文件的包含路径和依赖路径。如下图所示,这将导致一系列问题。如
“/usr/include/c++/7/cstdlib:75: error: stdlib.h: No such file or directory
#include_next <stdlib.h>
^~~~~~~~~~”
在这里插入图片描述
(2)windows下的动态库导出导入说明为__declspec(dllexport) _ _ declspec(dllimport)
而类似的,在linux下可以使用__attribute__((visibility(“default”)))标签和__attribute__ ((visibility(“hidden”)))标签来控制函数或者类在生成的动态库中可见或者不可见,可以理解为导出或者不导出。在编译时设置 -fvisibility=hidden,则不加 visibility声明的都默认为hidden; gcc默认设置 -fvisibility=default,即全部可见。
(3)在linux下的QtCreator中编译时为默认-fvisibility=default,即全部都可见。可通过在配置文件中设置QMAKE_CXXFLAGS += -fvisibility=hidden 来更改默认。

参考文献:

Linux动态库的查找路径
https://www.cnblogs.com/bwangel23/p/4695342.html
http://www.cnblogs.com/oubo/archive/2011/12/06/2394631.html
Linux动态库的导出控制
https://www.cnblogs.com/zzqcn/p/3640353.html
https://blog.csdn.net/zdragon2002/article/details/6061962

Logo

更多推荐