qMake:如何在 C++ 中为宏使用定义变量

qMake: how to define a variable for macro usage in C++

我正在尝试在我的 qMake *.pro 文件中指定变量,以便在我的实际代码(VS 2015 项目)中使用宏。

我确实有像这样的工作示例:

DEFINES += COPYRIGHT_STRING="\"$${QMAKE_TARGET_COPYRIGHT}\""
DEFINES += VERSION_STRING="\"$${QMAKE_TARGET_PRODUCT} $${VERSION}\""

我还想要一个字符串 3.4 的宏。我尝试了各种版本来写下来,但我总是得到以下错误。

RC : fatal error RC1107: invalid usage; use RC /? for Help

我尝试了以下变体,可能还有一两个我不记得了。

DEFINES += "LATEST_PROCESSABLE_VERSION=3.4"
DEFINES += LATEST_PROCESSABLE_VERSION=\"3.4\"
DEFINES += LATEST_PROCESSABLE_VERSION="\"3.4\""
DEFINES += LATEST_PROCESSABLE_VERSION=\\"3.4\\"

如果我只是省略定义变量的那一行 LATEST_PROCESSABLE_VERSION 一切都编译得很好(包括上面的工作示例)。

我的文件通常是这样的:

win32:TEMPLATE = vcapp
!win32:TEMPLATE = app

QT += core xml network
CONFIG += console
CONFIG += no_keywords

#C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
QMAKE_CXXFLAGS += /wd4290

VERSION = 3.2.0.3

QMAKE_TARGET_COMPANY = APP GMBH

QMAKE_TARGET_PRODUCT = Fancy Application

QMAKE_TARGET_DESCRIPTION = Does fancy stuff

QMAKE_TARGET_COPYRIGHT = COPYRIGHT (C) $${QMAKE_TARGET_COMPANY} 2018 - ALL RIGHTS RESERVED - FOR INTERNAL USE ONLY

DEFINES += DECODER_COPYRIGHT_STRING="\"$${QMAKE_TARGET_COPYRIGHT}\""
DEFINES += DECODER_VERSION_STRING="\"$${QMAKE_TARGET_PRODUCT} $${VERSION}\""
DEFINES += LATEST_PROCESSABLE_VERSION="\"3.4\""

# set application icon
RC_ICONS = Application.ico

INCLUDEPATH += ../FancyInclude
# ... more includes ...

HEADERS += fancy.h \
# ... many headers ...

SOURCES += main.cpp \
    fancy.cpp \
# ... many sources ...

contains(DEFINES, APP_ARCH_x32) {
    DESTDIR = ../../product/win32
    CONFIG(debug, debug|release) {
        OBJECTS_DIR = ./debug_x86
        MOC_DIR = ./debug_x86
        LIBS += -L../addon/Fab/Bin32 -llibfab32D
        TARGET = FancyApp32D
    } else {
        OBJECTS_DIR = ./release_x86
        MOC_DIR = ./release_x86
        QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
        QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
        LIBS += -L../addon/Fab/Bin32 -llibfab32D
        TARGET = FancyApp32
    }
}

contains(DEFINES, APP_ARCH_x64) {
    DESTDIR = ../../product/win64
    CONFIG(debug, debug|release) {
        OBJECTS_DIR = ./debug_x64
        MOC_DIR = ./debug_x64
        LIBS += -L../addon/Fab/Bin64 -llibfab64D
        TARGET = FancyApp64D
    } else {
        OBJECTS_DIR = ./release_x64
        MOC_DIR = ./release_x64
        QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
        QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
        LIBS += -L../addon/Fab/Bin64 -llibfab64D
        TARGET = FancyApp64
    }
}

经过密集 google 搜索后,我现在 运行 没有可供尝试的选项。有人可以帮忙吗?


编辑 1:

至少我认为我在顶部的那些例子工作了一次。但我目前甚至无法让它们(再次)工作,而且我完全不知道是什么导致了这里的错误。我什么都不知道了,请帮忙! -.-


编辑 2:

好吧,高温对我造成了伤害。实际问题是 QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCT 中的 space。以下示例现在可以正常工作。

...
QMAKE_TARGET_COMPANY = Test GmbH

QMAKE_TARGET_PRODUCT = Fancy Application

QMAKE_TARGET_DESCRIPTION = Does fancy stuff

QMAKE_TARGET_COPYRIGHT = 2018

DEFINES += COPYRIGHT_STRING="\"$${QMAKE_TARGET_COPYRIGHT}\""

DEFINES += VERSION_STRING="\"$${VERSION}\""

DEFINES += LATEST_DECODABLE_ESF_VERSION="\"3.4\""    
...

我愿意...

...在 QMAKE_TARGET_COPYRIGHT 中使用 spaces 以获得值 COPYRIGHT (C) $${QMAKE_TARGET_COMPANY} 2018 - ALL RIGHTS RESERVED - FOR INTERNAL USE ONLY

我想...

...定义另一个变量 APP_NAME_AND_VERSION_STRING,由 $${QMAKE_TARGET_PRODUCT}$${VERSION} 组成,由 space.

分隔

我怎样才能做到这一点?我没有找到任何让它工作的东西。

请记住,文本必须转义两次:qmake 本身和 shell 命令。所以正确的转义应该是这样的:

DEFINES += LATEST_PROCESSABLE_VERSION=\\"3.4\\"

DEFINES += APP_NAME_AND_VERSION_STRING="\\"$${QMAKE_TARGET_PRODUCT}\ $${VERSION}\\""

请注意,字符串中的所有空格都必须转义。

您也可以切换到使用 QMAKE_SUBSTITUTES 来自动生成适当的 C 头文件并避免难看的命令行 DEFINES.