QMAKE附加以定义而不尊重条件
QMake appending to DEFINE without respecting conditional
我创建了一个空的QT项目来说明我的问题。除了Pro文件中的此QMAKE代码外,该项目中没有什么。项目/构建配置只是默认值。
此Qmake代码始终执行$$system()
函数,但它在"幕后"。在某些神秘过程中,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创建者忽略条件并执行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解析器无法解析功能结果,因此此技巧使所有内容都可以根据需要工作!
- 如何摆脱为条件编译定义预处理器宏的需要?
- 如何在 LIBSVM 中定义具有不同条件的交叉验证?
- 具有迭代器和自定义步长的循环结束条件
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- C++成员函数的条件模板类定义
- 双循环变量的相等条件:未指定还是未定义
- 如何在C++中定义扩展到条件语句的宏?
- boost::asio::async_read_until 具有自定义匹配条件运算符重载混淆
- 条件C++类成员定义
- 模板定义中的条件
- 智能指针自定义删除器中的处理条件
- c if语句:第一个条件取代第二个ub或定义良好
- 在C++中定义带有条件的宏
- 在"if"条件中定义 fstream
- 根据成员变量的类型是否存在,有条件地定义该变量
- 具有自定义返回类型和"false"返回条件的函数?
- QMAKE附加以定义而不尊重条件
- 有条件地定义了C 中的参考变量
- 班级定义中的条件
- X宏中元素的条件定义