运行时依赖已在指定路径却找不到?Ubuntu Qt程序问题咨询
问题描述
在Ubuntu 22.04 LTS系统中,使用Qt构建依赖libother的应用,libother自身依赖libfftw3,两个依赖库位于同一目录。.pro文件配置如下:
TEMPLATE = app CONFIG += console c++11 CONFIG -= app_bundle CONFIG -= qt # Library runtime location unix{ QMAKE_LFLAGS += "-Wl,-rpath,'\$$ORIGIN'" } SOURCES += \ main.cpp # Include path INCLUDEPATH += $$PWD/include/ # Libraries LIBS += -L$$PWD/bin/ -lother
运行应用时,ldd输出显示程序能找到libother.so.1,但找不到同目录下的libfftw3.so.3.6.9:
ldd my_app libother.so.1 => /my_app_path/libother.so.1 # Path specified by -rpath libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 # System lib path libfftw3.so.3.6.9 => not found # This lib is in the same location as libother.so.1 but isn't found?
手动将该路径添加到运行时路径后可正常加载。
解决方案
1. 检查并修正libother的运行时路径
动态库libother加载自身依赖时,会使用自己的RPATH配置,而非主程序的RPATH。先查看libother的RPATH设置:
readelf -d libother.so.1 | grep RPATH
如果输出中没有包含$ORIGIN,说明libother编译时未配置正确的运行时路径,导致它无法在自身目录下查找libfftw3。
处理方式:
- 若可重新编译
libother,编译时添加链接参数:-Wl,-rpath='$ORIGIN' - 若无法重新编译,用
patchelf工具修改已有库:patchelf --set-rpath '$ORIGIN' libother.so.1
2. 检查libfftw3的SONAME与软链接
动态库加载时会依据SONAME查找文件,而非直接使用带完整版本号的文件名。先查看libfftw3的SONAME:
readelf -d libfftw3.so.3.6.9 | grep SONAME
如果输出的SONAME是libfftw3.so.3,但库目录中没有对应的软链接,就会加载失败。此时创建软链接:
cd /path/to/your/libs ln -s libfftw3.so.3.6.9 libfftw3.so.3
3. 修正Qt .pro文件中的RPATH转义
.pro文件中\$$ORIGIN的单引号可能导致解析异常,尝试修改为不带单引号的写法:
unix{ QMAKE_LFLAGS += -Wl,-rpath,\$$ORIGIN }
修改后重新编译应用再测试。
4. 调试动态库加载过程
用LD_DEBUG环境变量查看详细加载日志,定位具体失败原因:
LD_DEBUG=libs ./my_app
日志会显示每个库的查找路径和失败细节,帮助进一步排查问题。
内容的提问来源于stack exchange,提问作者RPH
相关产品推荐
相关产品推荐

