我创建了一个空的 Qt 项目来说明我的问题。除了 in pro 文件中的 QMake 代码外,项目中没有任何内容。项目/构建配置只是默认设置。
此 Qmake 代码始终执行 $$system()
函数,但它是“在幕后”执行的。有一些神秘的过程,其中 contains(DEFINES, anything)
总是评估为 true 并触发后续代码。请注意,您可以在我使用 something
和 anything
的地方使用任何值。
CONFIG( something ){ DEFINES+=anything }
contains( DEFINES, anything ){
message( anything! )
stdOut=$$system( echo x > test.txt )
}
else{
message( nothing! )
}
每次运行时(我只是将文件保存在 QtCreator 中以启动它 - 不运行 QMake),出现此一般消息:
Project MESSAGE: nothing!
一秒钟后,test.txt 文件出现在项目目录中。
更奇怪的是,如果您直接使用 CONFIG()
作为控制文件写入的条件,那么这不会发生。此外,如果您删除 CONFIG()
行,则不会发生这种情况。
似乎有一个神秘的后台进程对此进行评估并始终执行 DEFINES+=anything
然后继续处理存在的任何逻辑。
我知道,如果你有条件地将源文件添加到项目中,它们将一直出现在文件浏览树中,即使它们没有编译。这是 Qt Creator 忽略条件并为自己的目的执行 QMake 的示例。这是相同的机制在起作用吗?
最佳答案
我花了几个小时来解决这个问题,然后在发布我的问题后得到了答案。我经常发现,简单地详细解释我的问题似乎可以阐明解决问题的方法!
无论如何,我很确定我对引擎盖下发生的事情的猜测是正确的。 Qt Creator 执行一次代码传递,它忽略所有条件以创建定义(出于任何私有(private)目的...)。
一个解决方案是不设置定义值,而只使用像这样的 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! )
}
显然,黑盒解析器不解析函数结果,所以这个技巧使一切都按预期工作!
关于c++ - QMake附加到DEFINE而不考虑条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47715949/