我创建了一个空的Qt项目来说明我的问题。项目中没有任何内容,除了在pro文件中的这个QMake代码。项目/构建配置只是默认配置。
此Qmake代码始终执行$$system()
功能,但它在幕后执行#34;。有一些神秘的过程,其中contains( DEFINES, anything )
总是评估为真,并触发后续代码。请注意,您可以在我使用something
和anything
时使用任何值。
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的示例。这是相同的机制吗?
答案 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解析器无法解析函数结果,所以这个技巧使一切都按预期工作!