我的环境是:
Debian Linux 8 x86
qt 5.3.1安装在/opt中(避免与
系统安装qt)
季度创建者3.4.2
合同一般条件4.9.2
在创建我的应用程序时,我决定将一些功能分成几个部分。所以我创建了子文件夹项目(main
),其中有两个文件夹/子项目(UI
和logics
),如下所示:
主要的
用户界面
逻辑
当UI
是默认的qt小部件应用程序(main.cpp和window)时。logics
是一个非常简单的共享库,具有空类(空构造函数,无其他内容)。我又加了一句
DESTDIR = $$PWD/../UI
最后的
Logics
将在logics.pro
文件夹中创建。我添加了
LIBS += -L $$PWD -llogics
将
logics.so
可执行文件链接到UI
现在,当我使用
UI.pro
运行UI
项目中的可执行文件时,会出现奇怪的错误:UI:加载共享库时出错:liblogics.so.1:无法打开
共享对象文件:没有这样的文件或目录
该错误仅存在于
logics.so
派生的UI
类时。看起来QtCreator
找不到Logics
库。但当我查询它的依赖关系时,我发现没有问题:LDD逻辑.so
linux-gate.so.1 (0xb770d000)
libQt5Core.so.5 => /opt/Qt5.3.1/5.3/gcc/lib/libQt5Core.so.5
...
如果
QObject
类独立于logics.so
我的意思是,当我删除Qt
时,错误就消失了。但我不能将这个qt库路径添加到
Logics
中,因为它将与系统安装的qt库冲突。所以我的问题是-如何使用自定义链接的共享库从qtcreator运行main
Qt
项目? 最佳答案
好的,在搜索了Internet之后,我发现(我非常惊讶)Linux可执行文件默认情况下不包括库搜索路径中的当前文件夹。尽管可执行文件和库位于某个文件夹中,但可执行文件将无法加载*.so库。
所以至少有两种解决方案:
将LD_LIBRARY_PATH
设置为包括当前文件夹(或某些指定文件夹)
导出ld_library_path=。
设置Rpath。在*.pro
文件中添加以下行:
qmake_lflags+=-wl,-rpath,.