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

运行时依赖已在指定路径却找不到?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:50:28