运行可执行文件报error while loading shared libraries错误排查
问题原因
编译时添加的-L./lib参数仅在编译链接阶段告知编译器共享库的查找位置,程序运行时由系统动态链接器负责加载依赖库,默认不会搜索项目下的./lib目录,因此会抛出找不到libprogramma.so的报错,该问题和使用WSL还是原生Linux环境没有关系。
可行解决方案
按使用场景选择以下任意一种方案即可:
- 临时测试单次运行:执行程序前临时指定动态库搜索路径,命令如下:
LD_LIBRARY_PATH=./lib ./programma
该方式仅对当前单次运行生效,关闭终端后配置自动失效,适合快速验证功能场景。
全局生效永久配置:将项目的lib目录加入系统动态链接器的搜索路径:
- 获取项目lib目录的绝对路径,比如项目存放在
/home/user/code/programma,对应库路径就是/home/user/code/programma/lib - 新建配置文件:执行
sudo nano /etc/ld.so.conf.d/programma.conf,将上面获取的绝对路径写入文件后保存 - 执行
sudo ldconfig刷新动态链接库缓存即可,后续在任意位置运行该程序都能正常加载依赖库。
- 获取项目lib目录的绝对路径,比如项目存放在
一劳永逸修改Makefile(推荐):编译可执行文件时把库的搜索路径写入可执行文件本身的rpath字段,不需要修改系统配置、不需要额外设置环境变量,只要可执行文件和lib目录的相对位置不变就能正常运行。将Makefile里的test规则替换为以下内容:
test: lib/lib$(TARGET).so $(CXX) $(CFLAGS) -L./lib -Wl,-rpath,'$$ORIGIN/lib' $(CPPFLAGS) -MMD -o programma tests/main.cc -l$(TARGET)
其中$$ORIGIN代表可执行文件自身所在的目录,$$ORIGIN/lib即指向和可执行文件同目录下的lib文件夹,哪怕把整个项目文件夹移动到其他位置,程序也能正确找到依赖库。同时给test目标补充了库文件依赖,后续修改库代码后执行make test会自动先重新编译更新库文件,避免出现库版本不匹配问题。
内容的提问来源于stack exchange,提问作者Peredurz
相关产品推荐
相关产品推荐

