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

时间:2018-07-31 12:56:59

标签: visual-studio-2015 qmake

我正在尝试在我的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中的空格。以下示例现在可以正常工作。

...
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中的空格取值为COPYRIGHT (C) $${QMAKE_TARGET_COMPANY} 2018 - ALL RIGHTS RESERVED - FOR INTERNAL USE ONLY

我想...

...定义另一个变量APP_NAME_AND_VERSION_STRING,该变量由$${QMAKE_TARGET_PRODUCT}$${VERSION}组成,并用空格分隔。

我该如何实现?我没有找到任何使它起作用的东西。

1 个答案:

答案 0 :(得分:1)

请记住,文本必须两次转义:qmake本身和shell命令。因此,正确的转义应如下所示:

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

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

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

您还可以切换为使用QMAKE_SUBSTITUTES自动生成适当的C头文件并避免使用丑陋的命令行DEFINES