当qmake为运行时如何将变量传递给qmake项目文件

How to pass variables to qmake project file when qmake is run

我需要动态改变我的,例如在我的项目文件上调用 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 documenation,我应该可以做到以下几点:

FLAVOR = xyz

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

以上代码的用途:

检查是否定义了 APP_NAME(任何地方,甚至作为 qmake 参数传递)。如果未定义,则设置 APP_NAME 等于 FLAVOR 其中包含 xyz

我试过了:

其中 none 有效。

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

请注意一些答案表明问题标题存在问题。此后,我将标题编辑为更恰当地总结了我的问题和我希望实现的目标

您可以像这样将定义传递给 qmake:

qmake DEFINES+="APP_NAME myappname"

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

DEFINES += "APP_NAME=myappname"

我假设您不是在尝试添加 DEFINES(如在预处理器中定义的那样,传递给编译器),而是添加到 "assign" 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 的输出是:

...\Desktop\test_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

...\Desktop\test_qmake>qmake -v
QMake version 3.0
Using Qt version 5.7.1 in C:/Qt/5.7/mingw53_32/lib

// 编辑:关于 "defined" 语句,文档说“[...] 如果省略类型,则检查所有函数。”,其中 "type" 是第二个参数。似乎从字面上理解,即只检查函数,但不检查变量。 QMake function reference "defined"