【问题标题】:Qt Creator and conditional buildQt Creator 和条件构建
【发布时间】:2012-07-31 16:41:54
【问题描述】:

在我们的项目中,如果定义了 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 的错误吗?

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

【问题讨论】:

    标签: qt qt-creator


    【解决方案1】:

    只是为了完整性和答案的正确性。可能其他人需要这个带有条件源树的根 .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
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 您能否提供一些链接,将其称为故意的?我有一个案例,带有条件的 SUBDIRS 模板总是错误地发布所有包,而不仅仅是那些选定的包。我很好奇他们是如何解决这个问题的,我想多读一点
        【解决方案4】:

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

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

        【讨论】:

        • 我就是这么想的。也许我应该在官方 Qt 论坛上发布这个问题。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多