【问题标题】:QMake appending to DEFINE without respecting conditionalQMake 附加到 DEFINE 而不考虑条件
【发布时间】:2017-12-08 14:03:57
【问题描述】:

我创建了一个空的 Qt 项目来说明我的问题。除了 pro 文件中的这个 QMake 代码之外,项目中没有任何内容。项目/构建配置只是默认值。

这个 Qmake 代码总是执行$$system() 函数,但它是在“幕后”执行的。有一个神秘的过程,其中contains( DEFINES, anything ) ALWAYS 评估为真并触发后续代码。请注意,您可以在我使用过somethinganything 的地方使用任何值。

CONFIG( something ){ DEFINES+=anything }
contains( DEFINES, anything ){
    message( anything! )
    stdOut=$$system( echo x > test.txt )
}
else{
    message( nothing! )
}

每次运行时(我只是将文件保存在 QtCreator 中以启动它 - 不运行 QMake),会出现以下一般消息:

项目消息:没有!

一秒钟后,test.txt 文件出现在项目目录中。

更奇怪的是,如果您直接使用CONFIG() 作为控制文件写入的条件,则不会发生这种情况。此外,如果您删除该 CONFIG() 行,则不会发生这种情况。

似乎有一个神秘的后台进程对此进行评估,并始终执行DEFINES+=anything,然后继续处理存在的任何逻辑。

我知道,如果你有条件地将源文件添加到项目中,它们将始终出现在文件浏览树中,即使它们没有被编译。这是 Qt Creator 忽略条件并出于自己的目的执行 QMake 的示例。这是相同的机制吗?

【问题讨论】:

    标签: c++ qt qmake


    【解决方案1】:

    我浪费了几个小时来解决这个问题,然后在发布我的问题后就得到了答案。我经常发现简单地详细解释我的问题的行为似乎说明了如何解决它!

    无论如何,我很确定我对幕后发生的事情的猜测是正确的。 Qt Creator 执行代码传递,它忽略所有条件以创建定义(出于任何私人目的......)。

    一种解决方案是不设置定义值,而只使用这样的 QMake 变量:

    CONFIG( something ){ IS_SOMETHING=true } else { IS_SOMETHING=false }
    $$IS_SOMETHING{
        message( anything! )
        stdOut=$$system( echo x > test.txt )
    }
    else{
        message( nothing! )
    }
    

    如果您只需要在 QMake 中使用后续条件,那很好。然而,它的弱点是你没有将逻辑级联到你的 C++ 中。于是,我找到了一个更好的解决方案:

    defineReplace( hideFromIdeParser ){ return( $$1 ) }
    
    CONFIG( something ){ DEFINES+=$$hideFromIdeParser(anything) }
    contains( DEFINES, anything ){
        message( anything! )
        stdOut=$$system( echo x > test.txt )
    }
    else{
        message( nothing! )
    }
    

    显然,黑盒解析器不解析函数结果,所以这个技巧可以让一切按预期工作!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多