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