如何在运行qmake时将变量传递到qmake项目文件



在项目文件上调用qmake时,我需要动态更改例如应用程序名称和后续定义。

示例是:

include(version.pri)
QT       += core gui network concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
FLAVOR = ?
TARGET = ../bin/$$FLAVOR
TEMPLATE = app
message("Application name: $$APP_NAME")
!defined(APP_NAME) {
APP_NAME = $$FLAVOR
}
!defined(APP_ORG) {
APP_ORG = myorg
}
//...
message("Application name 2: $$APP_NAME")

输出

Application name:
Application name 2: ?

以上是我的项目文件摘录。


文档:

根据Qmake文档,我应该能够做到以下几点:

FLAVOR = xyz
!defined(APP_NAME) {
APP_NAME = $$FLAVOR
}

上述代码的用途:

检查是否定义了APP_NAME(任何位置,甚至作为qmake参数传递)。如果未定义,则将APP_NAME设置为等于包含xyzFLAVOR

我尝试过:

  • qmake -config debug "DEFINES += APP_NAME = myappname"
  • qmake -config debug "APP_NAME = myappname"
  • qmake -config debug APP_NAME = myappname

其中没有一个工作。

如何将定义传递给qmake,qmake将在Makefile中设置一个变量,即APP_NAME,如上例所示

请注意一些答案表明问题标题有问题。此后,我编辑了标题,对我的问题和我希望实现的目标进行了更恰当的总结

我认为您不是在尝试添加DEFINES(如预处理器定义中那样,传递给编译器),而是在QMake项目文件中"分配"使用的变量。

以下对我有效:

QT       += core gui network concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
FLAVOR = ?
TARGET = ../bin/$$FLAVOR
TEMPLATE = app
message("Application name: $$APP_NAME")
!defined(APP_NAME, var) {
APP_NAME = $$FLAVOR
}
message("Application name 2: $$APP_NAME")

如您所见,使"defined"语句起作用的一个看似关键的更改是添加"var"作为第二个参数。不知道为什么,但如果没有它,第二个输出是"?",而第一个输出正确地是"myappname"。

qmake的输出为:

...Desktoptest_qmake>qmake -config debug "APP_NAME = myappname"
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
Project MESSAGE: Application name: myappname
Project MESSAGE: Application name 2: myappname
...Desktoptest_qmake>qmake -v
QMake version 3.0
Using Qt version 5.7.1 in C:/Qt/5.7/mingw53_32/lib

//EDIT:关于"defined"-语句,文档说"[…]如果省略了type,则检查所有函数。",其中"type"是第二个参数。似乎是字面意思,即只检查函数,而不检查变量。QMake函数参考"已定义">

您可以将定义传递给qmake,如下所示:

qmake DEFINES+="APP_NAME myappname"

如果你想在专业文件中添加定义,你可以这样做:

DEFINES += "APP_NAME=myappname"

最新更新