加载自定义 dll + 自定义应用程序失败并显示:加载共享库时出错
Loading custom dll + custom app fails with: error while loading shared libraries
我的环境是:
- Debian Linux 8 x86
- Qt 5.3.1安装在/opt中(避免与
系统安装Qt)
- QtCreator 3.4.2
- 海湾合作委员会 4.9.2
在创建我的应用程序时,我决定将一些功能分成几个部分。所以我用 2 folders/subprojects(UI
和 logics
)创建了子文件夹项目(main
),像这样:
- 主要
- UI
- 逻辑
当 UI
是默认 Qt 小部件应用程序时(main.cpp 和 window)。 logics
是非常简单的共享库,带有空的 class Logics
(空的构造函数,仅此而已)。我添加了
DESTDIR = $$PWD/../UI
到 logics.pro
所以最终 logics.so
将在 UI
文件夹中创建。
UI.pro
我添加了
LIBS += -L $$PWD -llogics
到 link UI
可执行 logics.so
现在,当我从 UI
项目 QtCreator
运行 可执行文件时,我得到了奇怪的错误:
UI: error while loading shared libraries: liblogics.so.1: cannot open
shared object file: No such file or directory
错误仅在 Logics
class 从 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
class 独立于 Qt
我的意思是,当我删除 QObject
时,错误消失了。
但是我无法将此Qt库路径添加到LD_LIBRARY_PATH
中,因为它会与系统安装的Qt库冲突。
所以我的问题 - 我如何 运行 来自 QtCreator 的主要 UI
项目与我的自定义 linked 共享库?
好的,在搜索 Internet 后我发现(我非常惊讶)Linux 可执行文件默认情况下不在库搜索路径中包含当前文件夹。尽管可执行文件和库位于某个文件夹中,但可执行文件将无法加载 *.so 库。
所以至少有2种解法:
- 设置
LD_LIBRARY_PATH
以包含当前文件夹(或某些指定文件夹)
export LD_LIBRARY_PATH=.
- 设置Rpath。在
*.pro
文件中添加以下行:
QMAKE_LFLAGS += -Wl,-rpath,.
我的环境是:
- Debian Linux 8 x86
- Qt 5.3.1安装在/opt中(避免与 系统安装Qt)
- QtCreator 3.4.2
- 海湾合作委员会 4.9.2
在创建我的应用程序时,我决定将一些功能分成几个部分。所以我用 2 folders/subprojects(UI
和 logics
)创建了子文件夹项目(main
),像这样:
- 主要
- UI
- 逻辑
当 UI
是默认 Qt 小部件应用程序时(main.cpp 和 window)。 logics
是非常简单的共享库,带有空的 class Logics
(空的构造函数,仅此而已)。我添加了
DESTDIR = $$PWD/../UI
到 logics.pro
所以最终 logics.so
将在 UI
文件夹中创建。
UI.pro
我添加了
LIBS += -L $$PWD -llogics
到 link UI
可执行 logics.so
现在,当我从 UI
项目 QtCreator
运行 可执行文件时,我得到了奇怪的错误:
UI: error while loading shared libraries: liblogics.so.1: cannot open shared object file: No such file or directory
错误仅在 Logics
class 从 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
class 独立于 Qt
我的意思是,当我删除 QObject
时,错误消失了。
但是我无法将此Qt库路径添加到LD_LIBRARY_PATH
中,因为它会与系统安装的Qt库冲突。
所以我的问题 - 我如何 运行 来自 QtCreator 的主要 UI
项目与我的自定义 linked 共享库?
好的,在搜索 Internet 后我发现(我非常惊讶)Linux 可执行文件默认情况下不在库搜索路径中包含当前文件夹。尽管可执行文件和库位于某个文件夹中,但可执行文件将无法加载 *.so 库。
所以至少有2种解法:
- 设置
LD_LIBRARY_PATH
以包含当前文件夹(或某些指定文件夹)
export LD_LIBRARY_PATH=.
- 设置Rpath。在
*.pro
文件中添加以下行:
QMAKE_LFLAGS += -Wl,-rpath,.