使用 QMake 设置'make check'的路径/LD_LIBRARY_PATH



我有一个项目设置,其中包含几个带有共享库的应用程序,这一切都是使用 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.prfqt_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>

最新更新