在 qmake 中编译之前,如何使用可执行文件构建多个 header 文件?
How to build several header files using an executable before compiling in qmake?
我找到了一些方法(比如 Qt run script before make)如何 运行 脚本在编译其他任何东西之前构建一个目标。
我似乎没有完全理解。我不知道如何在编译所有内容之前通过调用 script/executable 来制作多个目标(几个 C++ header 文件),因为我需要那些生成的 header 文件进行编译。
简单地说,我会做类似的事情:
GENERATOR= \dist\gen_headers.exe
BUILD_SOURCES+= header1.h header2.h header3.h
header1.h header2.h header3.h: headers.h.in $(GENERATOR)
-$(RM) header1.h
-$(RM) header2.h
-$(RM) header3.h
$(GENERATOR) headers.h.in
clean-hook:
-$(RM) header1.h >NUL: 2>NUL:
-$(RM) header2.h >NUL: 2>NUL:
-$(RM) header3.h >NUL: 2>NUL:
如何在类似于以下文件的 pro 中的 qmake 中执行此操作?
win32:TEMPLATE = vclib
!win32:TEMPLATE = lib
QT += core
CONFIG += staticlib
CONFIG += no_keywords
#C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
QMAKE_CXXFLAGS += /wd4290
#forcing value to bool ->performance warning
QMAKE_CXXFLAGS += /wd4800
INCLUDEPATH += .
...
HEADERS += header1.h \
header2.h \
header3.h \
...
SOURCES += source.cpp \
...
contains(DEFINES, ARCH_x32) {
DESTDIR = ../Bin32
CONFIG(debug, debug|release) {
OBJECTS_DIR = ./debug_x86
MOC_DIR = ./debug_x86
TARGET = lib32D
} else {
OBJECTS_DIR = ./release_x86
MOC_DIR = ./release_x86
TARGET = lib32
}
}
contains(DEFINES, ARCH_x64) {
DESTDIR = ../Bin64
CONFIG(debug, debug|release) {
OBJECTS_DIR = ./debug_x64
MOC_DIR = ./debug_x64
TARGET = lib64D
} else {
OBJECTS_DIR = ./release_x64
MOC_DIR = ./release_x64
TARGET = lib64
}
}
编辑 1:
我尝试在 contains 语句之前添加以下代码,但它似乎不起作用。
headers.target = headersDep
headers.commands = echo "Building headers..."; \
dist\gen_headers.exe headers.h.in; \
echo "Done building headers."; \
headers.depends =
QMAKE_EXTRA_TARGETS += headers
PRE_TARGETDEPS = headersDep
当调用 qmake 时,我收到 header1、header2 和 header3 找不到的错误。如果我尝试编译,我会收到类似的错误 No such file or directory
。我的回声输出从未显示过。那我做错了什么?
编辑 2
嗯,我找到了system(command)。我从编辑 1 中删除了内容,并在 INCLUDEPATH
语句之前添加了以下内容。
message(Building headers...)
system(dist\gen_headers.exe headers.h.in):message(Done building headers.)
如果我调用 qmake 来构建项目,我的 headers 现在已经构建了,这很好。但是有一个问题:我在构建 headers 时发出的那对消息出现了 5 次。这是为什么?我只想构建 header 一次。
终于找到方法了。我在 qmake 中使用了 add my own compiler and got inspiration from here.
的可能性
我在 contains 语句之前添加了以下行。
# Building headers for each call of make (build process).
HEADERS_IN = headers.h.in
gen_headers.name = Building auto generated headers.
gen_headers.input = HEADERS_IN
gen_headers.output = header1.h header2.h header3.h
gen_headers.commands = dist\gen_headers.exe $${HEADERS_IN}
gen_headers.CONFIG += target_predeps
gen_headers.dependency_type = TYPE_C
gen_headers.variables_out = HEADERS
QMAKE_EXTRA_COMPILERS += gen_headers
现在,如果我在 Visual Studio 内编译,将构建 headers 并将 gen_headers.name
的内容作为输出发出。
我找到了一些方法(比如 Qt run script before make)如何 运行 脚本在编译其他任何东西之前构建一个目标。
我似乎没有完全理解。我不知道如何在编译所有内容之前通过调用 script/executable 来制作多个目标(几个 C++ header 文件),因为我需要那些生成的 header 文件进行编译。
简单地说,我会做类似的事情:
GENERATOR= \dist\gen_headers.exe
BUILD_SOURCES+= header1.h header2.h header3.h
header1.h header2.h header3.h: headers.h.in $(GENERATOR)
-$(RM) header1.h
-$(RM) header2.h
-$(RM) header3.h
$(GENERATOR) headers.h.in
clean-hook:
-$(RM) header1.h >NUL: 2>NUL:
-$(RM) header2.h >NUL: 2>NUL:
-$(RM) header3.h >NUL: 2>NUL:
如何在类似于以下文件的 pro 中的 qmake 中执行此操作?
win32:TEMPLATE = vclib
!win32:TEMPLATE = lib
QT += core
CONFIG += staticlib
CONFIG += no_keywords
#C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
QMAKE_CXXFLAGS += /wd4290
#forcing value to bool ->performance warning
QMAKE_CXXFLAGS += /wd4800
INCLUDEPATH += .
...
HEADERS += header1.h \
header2.h \
header3.h \
...
SOURCES += source.cpp \
...
contains(DEFINES, ARCH_x32) {
DESTDIR = ../Bin32
CONFIG(debug, debug|release) {
OBJECTS_DIR = ./debug_x86
MOC_DIR = ./debug_x86
TARGET = lib32D
} else {
OBJECTS_DIR = ./release_x86
MOC_DIR = ./release_x86
TARGET = lib32
}
}
contains(DEFINES, ARCH_x64) {
DESTDIR = ../Bin64
CONFIG(debug, debug|release) {
OBJECTS_DIR = ./debug_x64
MOC_DIR = ./debug_x64
TARGET = lib64D
} else {
OBJECTS_DIR = ./release_x64
MOC_DIR = ./release_x64
TARGET = lib64
}
}
编辑 1:
我尝试在 contains 语句之前添加以下代码,但它似乎不起作用。
headers.target = headersDep
headers.commands = echo "Building headers..."; \
dist\gen_headers.exe headers.h.in; \
echo "Done building headers."; \
headers.depends =
QMAKE_EXTRA_TARGETS += headers
PRE_TARGETDEPS = headersDep
当调用 qmake 时,我收到 header1、header2 和 header3 找不到的错误。如果我尝试编译,我会收到类似的错误 No such file or directory
。我的回声输出从未显示过。那我做错了什么?
编辑 2
嗯,我找到了system(command)。我从编辑 1 中删除了内容,并在 INCLUDEPATH
语句之前添加了以下内容。
message(Building headers...)
system(dist\gen_headers.exe headers.h.in):message(Done building headers.)
如果我调用 qmake 来构建项目,我的 headers 现在已经构建了,这很好。但是有一个问题:我在构建 headers 时发出的那对消息出现了 5 次。这是为什么?我只想构建 header 一次。
终于找到方法了。我在 qmake 中使用了 add my own compiler and got inspiration from here.
的可能性我在 contains 语句之前添加了以下行。
# Building headers for each call of make (build process).
HEADERS_IN = headers.h.in
gen_headers.name = Building auto generated headers.
gen_headers.input = HEADERS_IN
gen_headers.output = header1.h header2.h header3.h
gen_headers.commands = dist\gen_headers.exe $${HEADERS_IN}
gen_headers.CONFIG += target_predeps
gen_headers.dependency_type = TYPE_C
gen_headers.variables_out = HEADERS
QMAKE_EXTRA_COMPILERS += gen_headers
现在,如果我在 Visual Studio 内编译,将构建 headers 并将 gen_headers.name
的内容作为输出发出。