加载自定义dll +自定义应用失败,并在加载共享库时遇到错误

时间:2015-07-29 01:17:18

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

我的环境是:

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

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

    • UI
    • 逻辑

UI是默认的Qt Widget应用程序(main.cpp和窗口)时。 logics是一个非常简单的共享库,包含空类Logics(空构造函数,而不是其他内容)。我添加了

DESTDIR = $$PWD/../UI

logics.pro,以便在logics.so文件夹中创建最终UI。 到UI.pro我添加了

LIBS += -L $$PWD -llogics

UI可执行文件与logics.so

相关联

现在,当我使用UIQtCreator项目运行可执行文件时,我得到了一个奇怪的错误:

  

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项目?

1 个答案:

答案 0 :(得分:0)

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

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

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

    export LD_LIBRARY_PATH =。

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

      QMAKE_LFLAGS + = -Wl,-rpath,。