【程序运行问题】链接的时候加上了动态库,但是在运行的时候显示找不到对应库位置

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.confld.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' >> ~/.bashrc
    • source ~/.bashrc

[1] Linux程序运行时找不到动态库的解决方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值