【问题标题】:Loading custom dll + custom app fails with: error while loading shared libraries加载自定义 dll + 自定义应用程序失败:加载共享库时出错
【发布时间】:2015-07-29 01:17:17
【问题描述】:

我的环境是:

  • Debian Linux 8 x86
  • Qt 5.3.1 安装在 /opt 中(避免与 系统安装Qt)
  • QtCreator 3.4.2
  • GCC 4.9.2

在创建我的应用程序时,我决定将一些功能分成几个部分。所以我创建了带有 2 个文件夹/子项目(UIlogics)的子文件夹项目(main),如下所示:

  • 主要
    • 用户界面
    • 逻辑

UI 是默认的Qt Widget 应用程序(main.cpp 和窗口)。 logics 是一个非常简单的共享库,带有空类 Logics(空构造函数,仅此而已)。我已经添加了

DESTDIR = $$PWD/../UI

logics.pro 所以最终的logics.so 将在UI 文件夹中创建。 UI.pro 我已经添加了

LIBS += -L $$PWD -llogics

UI 可执行文件与logics.so 链接

现在,当我使用 QtCreatorUI 项目运行可执行文件时,出现奇怪的错误:

UI:加载共享库时出错:liblogics.so.1:无法打开 共享对象文件:没有这样的文件或目录

该错误仅在Logics 类派生自QObject 时存在。看起来 logics.so 找不到 Qt 库。但是当我查询它的依赖项时,我发现没有问题:

ldd logics.so

    linux-gate.so.1 (0xb770d000)
    libQt5Core.so.5 => /opt/Qt5.3.1/5.3/gcc/lib/libQt5Core.so.5
    ...

如果Logics 类独立于Qt 我的意思是,当我删除QObject 时,错误就消失了。

但我不能将这个 Qt 库路径添加到 LD_LIBRARY_PATH,因为它会与系统安装的 Qt 库冲突。

所以我的问题 - 我如何使用我的自定义链接共享库从 QtCreator 运行我的主 UI 项目?

【问题讨论】:

    标签: c++ linux qt dll shared-libraries


    【解决方案1】:

    好的,在搜索 Internet 后,我​​发现(我很惊讶)Linux 可执行文件默认情况下不包括库搜索路径中的当前文件夹。尽管可执行文件和库位于某个文件夹中,但可执行文件将无法加载 *.so 库。

    所以至少有2个解决方案:

    1. 设置LD_LIBRARY_PATH 包含当前文件夹(或某些指定文件夹)

    导出 LD_LIBRARY_PATH=。

    1. 设置Rpath。在*.pro 文件中添加以下行:

    QMAKE_LFLAGS += -Wl,-rpath,.

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多