QMake在不尊重条件的情况下附加到DEFINE

时间:2017-12-08 14:03:57

标签: c++ qt qmake

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

此Qmake代码始终执行$$system()功能,但它在幕后执行#34;。有一些神秘的过程,其中contains( DEFINES, anything )总是评估为真,并触发后续代码。请注意,您可以在我使用somethinganything时使用任何值。

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

每次运行时(我只是将文件保存在QtCreator中以启动它btw - 不运行QMake),此常规消息出现:

  

项目信息:什么都没有!

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我浪费了几个小时来打击这个,然后在发布我的问题之后得到了答案。我经常发现,简单解释我的问题的行为似乎澄清了如何解决它!

无论如何,我非常确定我的猜测是正确的。 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! )
}

显然,blackbox解析器无法解析函数结果,所以这个技巧使一切都按预期工作!