gpt4 book ai didi

c++ - QMake附加到DEFINE而不考虑条件

转载 作者:太空狗 更新时间:2023-10-29 22:56:32 28 4
gpt4 key购买 nike

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

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com