我有一个带有共享库的几个应用程序的项目设置,这些都是使用SUBDIRS项目很好地构建的,其中应用程序依赖于共享库。
TEMPLATE = subdirs
SUBDIRS = app1 app2 sharedLib
app1.depends = sharedLib
app2.depends = sharedLib
每个应用程序还包含许多测试,CONFIG += testcase
设置。
这会创建一个check
目标,以便我们可以使用make check
从顶级.pro运行所有单元测试。
问题是某些应用测试需要在sharedLib中存在代码,因此需要根据每个平台库查找规则发现它。
在Windows上,一个选项是在PATH
上设置sharedLib位置,在linux上我们可以在mac LD_LIBRARY_PATH
上将sharedLib位置添加到DYLD_LIBRARY_PATH
。
一种解决方案是在运行make check
之前设置构建的共享库的位置:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:build/sharedDll/
make check
这可行,但它似乎有点多余,因为构建脚本本身正在构建共享库,因此他们知道sharedLib二进制位置的路径,可以从.pro / pri文件中引用:
$$TOP_BUILDDIR/sharedLib/release
那么,为了PATH/LD_LIBRARY_PATH/DYLD_LIBRARY_PATH
命令的目的,是否还要在项目文件中设置make check
?
答案 0 :(得分:0)
如果您使用的是gcc,则可以使用gcc的rpath参数。
-rpath = DIR
将目录添加到运行时库搜索路径。这是用的 将ELF可执行文件与共享对象链接时。所有-rpath
参数被连接并传递给运行时链接器,其中包含 使用它们在运行时找到共享对象。
QMAKE_CXXFLAGS + = -rpath = / the / absolute / path
如果使用该技术,则无需编辑LD_LIBRARY_PATH
答案 1 :(得分:0)
在Qt 5.5中,以下qmake语句为目标$$TOP_BUILDDIR/sharedLib/release
添加LD_LIBRARY_PATH
到check
的路径:
check.commands = LD_LIBRARY_PATH=$$TOP_BUILDDIR/sharedLib/release:\$$LD_LIBRARY_PATH $$check.commands
我从文件testcast.prf
和qt_functions.prf
(特别是函数qtAddTargetEnv()
和qtAddToolEnv()
)中获取了此解决方案的灵感,两者都位于$$[QT_INSTALL_PREFIX]/mkspecs/features
。< / p>