【问题标题】:Add a define to qmake WITH a value?添加一个定义到 qmake WITH 一个值?
【发布时间】:2011-03-21 21:27:14
【问题描述】:

如何使用带有值的 qmake 添加定义:

例如,这在我的 .pro 文件中不起作用(如我所料):

DEFINES += WINVER 0x0500

也没有

DEFINES += "WINVER 0x0500"

如何在开始编译之前将 WINVER 定义为 0x0500,这样它的定义就不会受到编译或包含顺序的任何影响?

【问题讨论】:

    标签: qt qmake


    【解决方案1】:

    DEFINES += "WINVER=0x0500" 为我工作。

    这样,-DWINVER=0x0500 被添加到编译器的命令行中,这是 GCC/mingw 期望用于命令行预处理器定义的语法(详见here)。

    【讨论】:

    • +1 这很好用,谢谢!正如您所说,它在 Makefile 中添加了-DWINVER=0x0500。 PS - 我不需要引号,因为没有空格。 ;)
    • 为了后代,如果你想在qmake文件中定义一个字符串值,似乎你必须使用一个相当奇怪的斜线和引号组合:DEFINES += MY_DEF='\\"string \\"'
    【解决方案2】:
    DEFINES += MY_DEF=\\\"String\\\"
    

    此格式用于将宏替换为字符串元素时使用

    【讨论】:

      【解决方案3】:

      作为附录,如果你想执行 shell 代码而不是仅仅设置一个常量(例如,用于获取版本号或日期):

      要么使用$$system()。这是在执行 qmake 时运行的:

      DEFINES += GIT_VERSION=$$system(git describe --always)
      

      如果代码应该在每次构建时运行(即在执行 makefile 时),则使用 $()。 对于DEFINES,如果命令包含空格,则需要转义,否则 qmake 会插入不需要的-D

      DEFINES += GIT_VERSION='$(shell git describe --always)'
      

      这将被逐字复制到 makefile 中。

      如果命令的输出包含空格,则需要另一层擒纵(这次是make):

      DEFINES += BUILD_DATE='"$(shell date)"'
      

      如果你需要在你的值周围加上引号来获取一个字符串,它会变得有点难看:

      DEFINES += BUILD_DATE='"\\\"$(shell date)\\\""'
      

      我建议在这种情况下使用预处理器字符串化操作:

      #define _STR(x) #x
      #define STRINGIFY(x)  _STR(x)
      
      printf("this was built on " STRINGIFY(BUILD_DATE) "\n");
      

      【讨论】:

      • +1 表示 GIT_VERSION 示例和有关转义引号的说明。 OT 但我发现以下最有用的GIT_VERSION=\\\"$$system(git describe --always --abbrev=0)\\\" 来获取最新的标签版本,或者当前提交失败
      • 并不是说 «every build» 选项在 Windows 中不起作用(因为构建是通过 nmake 执行的,而不是真正的 make)
      • STRINGIFY 让我的生活轻松了很多。
      【解决方案4】:

      #define STRING“带空格的值”来自 Qt *.PRO 文件:

      为了从 QT 项目文件中添加 #define STRING "Value with spaces",我们必须这样写:

      DEFINES += "VERSION_LOG=\"\\\"Version 2.5.1\\\"\""
      DEFINES += "VERSION_QT=\"\\\"Qt 5.10\\\"\""
      

      它提供了 Makefile.Release 文件:

      DEFINES       = -DUNICODE -D_UNICODE -DVERSION_LOG="\"Version 2.5.1\"" -DVERSION_QT="\"Qt 5.10\"" -DQT_NO_DEBUG [...]
      

      总之,在那一行:DEFINES += "VERSION_LOG=\"\\\"Version 2.5.1\\\"\""

      第一个和最后一个 " 告诉 QMake 将整个句子读取为一个字符串

      第一个和最后一个\" 将第一个和最后一个" 写入-DVERSION_LOG="\"Version 2.5.1\""

      第一个和最后一个\\\"\ 然后" 写入-DVERSION_LOG="\"Version 2.5.1\""

      【讨论】:

        【解决方案5】:

        Greg 的答案在 .pro 文件中运行良好。但是,当从命令行调用 qmake 时,我不得不离开空格,即使用 sth.像下面这样,做一个定义工作:

        qmake DEFINES+="WINVER 0x0500"
        

        【讨论】:

          【解决方案6】:

          如果你想定义一个在 Objective-C 中使用的字符串文字,那么你需要记住转义引号之前的 @

          DEFINES += MY_DEF='@\\"string-literal\\"'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-09
            • 1970-01-01
            • 1970-01-01
            • 2020-05-09
            • 1970-01-01
            相关资源
            最近更新 更多