如何使SUBDIRS级别的定义在qt中的子项目中可见

How to make SUBDIRS level defines visible in subprojects in qt?

本文关键字:qt 子项目 定义 何使 SUBDIRS      更新时间:2023-10-16

问题如下:

我有一个文件夹,其中包含一堆库项目和两个生成实际可执行文件的项目。两个exe项目都使用该文件夹中的库来完成任务,但在其他方面都是独立的程序。所以,我在那个文件夹里有两个SUBDIRS项目。

super1.pro
super2.pro 

此外,这方面的内容并不多,但库中的一些代码路径取决于实际构建的超级项目。通过将其添加到.cpp文件中,可以解决依赖关系

#ifdef SUPER1

那么,问题出在哪里呢?问题是

DEFINES+=SUPER1

在super1.pro中添加的将在子项目中不可见,并且直接或通过.pri文件将其添加到子项目中无法解决需要构建其他项目的时间。然后必须手动将代码更改为super2,这是不好的。

下面我有我的解决方案,但感觉太复杂了。如果有人有我遗漏的更好的,请评论/回答。

我的解决方案的基础是这篇文章:http://qt-project.org/wiki/QMake-top-level-srcdir-and-builddir

我们首先需要向超级项目解析顺序添加一个自定义.pro文件。在super1.pro中,我们添加了:

SUBDIRS += super1_DEFINES.pro sub1 sub2 sub3....

在super1_DEFINES.pro中,我们编写以下

TEMPLATE=subdirs
SUBDIRS= # don't build anything, we're just generating the .qmake.cache file
system(rm .qmake_cache.in)
system(cp .qmake.cache.super1 .qmake.cache.in)
QMAKE_SUBSTITUTES += .qmake.cache.in

这里发生的是,我们使用一个系统调用将.qmake.cache.in占位符文件重写为超级项目*_DEFINES文件指定的占位符文件。然后,系统会选择这个重写后的文件,并将其作为.qmake.cache放入builddir中,最重要的是,所有子项目都会选择该文件中的DEFINES。qmake.cache.super1实际上只是一个简单的.pro文件,它可能看起来像这样:

DEFINES += SOMEVARIABLE

当你想构建时,比如说,super42.pro,你只需要使用

SUBDIRS += super42_DEFINES.pro sub1 sub2 sub3....

system(cp .qmake.cache.super42 .qmake.cache.in)

就这样。就像我说的,解决方案似乎太复杂了。我希望有更好的方法,但到目前为止这对我有效。