【发布时间】:2011-03-21 21:27:14
【问题描述】:
如何使用带有值的 qmake 添加定义:
例如,这在我的 .pro 文件中不起作用(如我所料):
DEFINES += WINVER 0x0500
也没有
DEFINES += "WINVER 0x0500"
如何在开始编译之前将 WINVER 定义为 0x0500,这样它的定义就不会受到编译或包含顺序的任何影响?
【问题讨论】:
如何使用带有值的 qmake 添加定义:
例如,这在我的 .pro 文件中不起作用(如我所料):
DEFINES += WINVER 0x0500
也没有
DEFINES += "WINVER 0x0500"
如何在开始编译之前将 WINVER 定义为 0x0500,这样它的定义就不会受到编译或包含顺序的任何影响?
【问题讨论】:
DEFINES += "WINVER=0x0500" 为我工作。
这样,-DWINVER=0x0500 被添加到编译器的命令行中,这是 GCC/mingw 期望用于命令行预处理器定义的语法(详见here)。
【讨论】:
-DWINVER=0x0500。 PS - 我不需要引号,因为没有空格。 ;)
DEFINES += MY_DEF=\\\"String\\\"
此格式用于将宏替换为字符串元素时使用
【讨论】:
作为附录,如果你想执行 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");
【讨论】:
GIT_VERSION=\\\"$$system(git describe --always --abbrev=0)\\\" 来获取最新的标签版本,或者当前提交失败
#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\""
【讨论】:
Greg 的答案在 .pro 文件中运行良好。但是,当从命令行调用 qmake 时,我不得不离开空格,即使用 sth.像下面这样,做一个定义工作:
qmake DEFINES+="WINVER 0x0500"
【讨论】:
如果你想定义一个在 Objective-C 中使用的字符串文字,那么你需要记住转义引号之前的 @
DEFINES += MY_DEF='@\\"string-literal\\"'
【讨论】: