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

标签 c++ qt qmake

我创建了一个空的 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/

相关文章:

c++ - 在 Linux 中寻找将加密文本从 C++ 应用程序写入加密 gpg 文件的正确方法

c++ - linux:如何断开远程用户访问?

c++ - 使用 QMake 进行仅 header 和静态构建

makefile - 如何在 qmake 生成的 Makefile 中添加自定义目标?

Qmake INSTALLS 变量 - 创建目录的符号链接(symbolic link)

c++ - 在 Qt 信号中发出 QVector 引用会导致复制

c++ - 在 C++ 中使用 MinGW 工具包含多个类/.o 文件

c++ - QtCreator : How to compile external source files

c++ - 如何在 C++ Qt 中填充静态 QMap 的值?

c++ - 如何删除 typename 中每个元素的 const ref 修饰符... T