You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行可执行文件报error while loading shared libraries错误排查

问题原因

编译时添加的-L./lib参数仅在编译链接阶段告知编译器共享库的查找位置,程序运行时由系统动态链接器负责加载依赖库,默认不会搜索项目下的./lib目录,因此会抛出找不到libprogramma.so的报错,该问题和使用WSL还是原生Linux环境没有关系。

可行解决方案

按使用场景选择以下任意一种方案即可:

  • 临时测试单次运行:执行程序前临时指定动态库搜索路径,命令如下:
LD_LIBRARY_PATH=./lib ./programma

该方式仅对当前单次运行生效,关闭终端后配置自动失效,适合快速验证功能场景。

  • 全局生效永久配置:将项目的lib目录加入系统动态链接器的搜索路径:

    1. 获取项目lib目录的绝对路径,比如项目存放在/home/user/code/programma,对应库路径就是/home/user/code/programma/lib
    2. 新建配置文件:执行sudo nano /etc/ld.so.conf.d/programma.conf,将上面获取的绝对路径写入文件后保存
    3. 执行sudo ldconfig刷新动态链接库缓存即可,后续在任意位置运行该程序都能正常加载依赖库。
  • 一劳永逸修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:27:07