c++ - 加载自定义 dll + 自定义应用程序失败并显示 : error while loading shared libraries

标签 c++ linux qt dll shared-libraries

我的环境是:

  • Debian Linux 8 x86
  • Qt 5.3.1 安装在/opt 中(避免与 系统安装Qt)
  • QtCreator 3.4.2
  • 海湾合作委员会 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: error while loading shared libraries: liblogics.so.1: cannot open shared object file: No such file or directory

该错误仅在 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 项目?

最佳答案

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

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

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

export LD_LIBRARY_PATH=.

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

QMAKE_LFLAGS += -Wl,-rpath,.

关于c++ - 加载自定义 dll + 自定义应用程序失败并显示 : error while loading shared libraries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31689703/

相关文章:

c++ - 访问类内的 union 中的变量

c++ - 在 Objective-C Mac App 中使用 TagLib(C++ 库)

c++ - VS 编译器可以访问私有(private)复制函数

linux - 在 bash shell 中获取圆的半径

c++ - STL中构造函数调用的顺序

linux - 优先级调度 OS bash 文件

c - Linux aio(不是 posix)例子?

c++ - 如何为运行时构建的菜单正确设置通用 QT 操作?

c++ - 使用 Qt 绘制抛物线或任何其他多项式

c++ - 使用 C++ 和 QML 的 Qt 应用程序