2

在我们的项目中,如果定义了 MACRO,我们会添加一些源文件和头文件。我们这样做,在 .pro 文件中:

contains(DEFINES, MY_DEF) {
message("Support MY_DEF")
INCLUDEPATH += \
    my_include_dir
SOURCES += \
    source1.cpp \
    source2.cpp
HEADERS +=  \
    my_include_dir/header1.h \
    my_include_dir/header2.h
FORMS +=  \
    myform.ui
}

这在构建期间工作正常。如果未定义 MY_DEF,则不会编译文件。MY_DEF 是这样定义的:

DEFINES += MY_DEF

奇怪的是,Qt Creator 总是在项目树中显示文件,而 MY_DEF 是否已定义。如果没有定义,它们不会用于构建,但它们仍然可以显示和编辑,搜索可以扫描它们等等......这是 Qt Creator 的错误吗?

这不是什么大问题,只是有点烦人,因为我们不清楚一个文件是否是项目的一部分。

4

4 回答 4

2

甚至是故意的。有一种特殊的“累积”解析模式来收集 .pro 文件中提到的所有文件(与用于收集“可翻译字符串”的文件基本相同)以显示在项目树中。否则,诸如“在项目中的所有文件中替换”之类的内容会根据平台或运行它的上下文产生不同的结果。[而且它不是包含 qmake 的一半,而是接近全部...]

于 2012-08-04T12:18:26.293 回答
0

这似乎是 QtCreator 以及它如何读取 .pro 文件的问题 - 它似乎实际上并没有完全解析文件,而是选择只挑选某些位。对于仅包含在一个或另一个平台上的文件,我也遇到了同样的问题——在 QtCreator 中,它们总是出现。

我希望原因是他们不想重新实现 qmake 的一半只是为了获取文件列表,或者在某些情况下尝试“正确”解析它会得到错误的答案,而且他们已经选择是可预见的错误而不是随机错误。

于 2012-08-02T16:51:40.207 回答
0

除了 QMake 中的条件包含之外,我还在此类条件源代码周围添加了#ifdef。这样,当不满足条件时,我也可以直观地看到它退出编译。这不如让文件完全从项目树中删除,但如果它们不适用,则在编辑它们时让它们仍然看起来像它们是构建的一部分要好。

于 2017-01-05T17:21:08.333 回答
0

只是为了完整性和答案的正确性。可能其他人需要这个带有条件源树的根 .pro 文件示例:

TEMPLATE = subdirs
SUBDIRS = device

CONFIG -= debug_and_release

_SANDBOX_DIR = $$dirname(PWD)
_PLAYER_PRO = $${_SANDBOX_DIR}/player/player.pro

SUBDIRS = device

device.subdir = $${_SANDBOX_DIR}/proxy/libproxy

contains(QMAKE_PLATFORM, android) {
    unset(_PLAYER_PRO)
} else {
    SUBDIRS += player

    player.file = $${_PLAYER_PRO}
    player.depends = device
}

SUBDIRS += app

app.subdir = $${_SANDBOX_DIR}/display/display
app.depends = device

contains(SUBDIRS, player) {
    app.depends += player
}
于 2021-11-15T19:07:55.513 回答