1. 问题根源
在编译时加上动态库只是告诉编译器在链接时要使用该动态库中的符号(函数、变量),但并不意味着运行时就不需要动态库了
动态库加载:动态库只有在运行时才会被真正加载到进程的地址空间当中。
- 编译时的链接只是确定了可执行文件内和可执行文件间的依赖关系。
- 实际的加载和符号的解析是由操作系统的动态链接器来完成的,如果在运行时找不到动态库,动态链接器就无法将库中的代码和数据加载到进程中,导致运行出错。
2. 常用解决方法
2.1. 默认搜索路径
系统默认会在/lib、/usr/lib、/usr/local/lib路径中查找动态库,所以将动态库添加到系统默认搜索路径即可。
- 系统默认头文件:
/usr/include、/usr/local/include - 系统默认库文件:
/lib、/usr/lib、/usr/local/lib
【注意】如果在这些目录下新建自定义目录后,系统并不会自动将这个自定义目录添加到搜索路径中。
2.2. ldconfig配置
ldconfig用于管理动态链接库的缓存和配置,主要是更新动态链接库的缓存文件,使得系统能够快速找到动态链接库。
更新动态链接库缓存:
- ldconfig 会扫描指定的目录(通常是 lib 和 lib 等),找到动态链接库文件(.so),并将它们的路径记录到缓存文件
ld.so.cache中。这个缓存文件加速了动态链接库的查找过程。 - 创建符号链接:如果动态链接库的文件名中包含版本号(如 libexample.so.1.0.0),ldconfig 会自动为它创建一个符号链接(如 libexample.so.1),以便程序可以通过通用名称访问库。
- 支持自定义库路径:通过配置文件
ld.so.conf或ld.so.conf.d中的条目,ldconfig 可以扫描额外的目录,支持用户安装的非系统路径下的库。
用法:sudo ldconfig
扫描默认目录,以及ld.so.conf中指定的目录,更新ld.so.cache。
2.3. 环境变量
- 临时设置:设置LD_LIBRARY_PATH环境变量,在运行程序前临时指定动态库搜索路径。
Export LD_LIBRARY_PATH=/path/to/your/lib:$LD_LIBRARY_PATH - 用户级配置:或者添加到shell配置文件
~/.bashrc当中使其永久生效。- bashrc是bash的配置文件,用于定制bash的行为和环境。当bash启动时,它就会读取bashrc当中配置信息,并根据这些信息来配置环境变量、定义别名、设置提示符。bashrc只对当前用户生效。
Echo 'Export LD_LIBRARY_PATH=/path/to/your/lib:$LD_LIBRARY_PATH' >> ~/.bashrcsource ~/.bashrc

2487

被折叠的 条评论
为什么被折叠?



