61

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

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

DEFINES += WINVER 0x0500

也不

DEFINES += "WINVER 0x0500"

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

4

6 回答 6

77

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

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

于 2010-07-28T05:33:25.127 回答
54
DEFINES += MY_DEF=\\\"String\\\"

当打算将宏替换为字符串元素时,将使用此格式

于 2013-08-20T19:27:12.170 回答
29

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

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

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

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

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

然后,这将被逐字复制到 makefile 中。

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

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

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

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

在这种情况下,我建议使用预处理器 stringify 操作:

#define _STR(x) #x
#define STRINGIFY(x)  _STR(x)

printf("this was built on " STRINGIFY(BUILD_DATE) "\n");
于 2014-06-03T08:25:19.530 回答
11

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

为了从 QT 项目文件中添加一个#define STRING“带空格的值”,我们必须编写:

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\""

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

于 2018-02-14T10:33:18.770 回答
4

Greg 的答案在 .pro 文件中运行良好。但是,当从命令行调用 qmake 时,我不得不离开空格,即使用 sth。如下所示,进行定义工作:

qmake DEFINES+="WINVER 0x0500"
于 2015-01-23T08:38:53.003 回答
1

如果要定义用于 Objective-C 的字符串文字,则需要记住转义引号之前的 @

DEFINES += MY_DEF='@\\"string-literal\\"'
于 2018-11-29T18:18:10.217 回答