QMAKE附加以定义而不尊重条件

QMake appending to DEFINE without respecting conditional

本文关键字:条件 定义 QMAKE      更新时间:2023-10-16

我创建了一个空的QT项目来说明我的问题。除了Pro文件中的此QMAKE代码外,该项目中没有什么。项目/构建配置只是默认值。

此Qmake代码始终执行$$system()函数,但它在"幕后"。在某些神秘过程中,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创建者忽略条件并执行QMAKE的一个示例。这是相同的机制吗?

我浪费了几个小时与此战斗,然后在发布我的问题后就得出了答案。我经常发现,简单地详细解释我的问题的行为似乎澄清了如何解决它!

无论如何,我很确定我的猜测是正确的,对引擎盖下的情况是正确的。QT创建者执行代码的通行证,其中它忽略了所有条件以创建定义(出于任何私人目的...)。

一种解决方案是不设置值,只使用这样的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解析器无法解析功能结果,因此此技巧使所有内容都可以根据需要工作!