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_COMPANY
和 QMAKE_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
.
我正在尝试在我的 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_COMPANY
和 QMAKE_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
.