我找到了一些方法(比如Qt run script before make)如何在编译其他任何内容之前运行构建一个目标的脚本。
我似乎没有得到整个概念。在编译所有内容之前,我不知道如何通过调用脚本/可执行文件来创建多个目标(几个C ++头文件),因为我需要这些生成的头文件进行编译。
简单地说,我会做类似的事情:
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:
我如何在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:
我已尝试在包含语句之前添加以下代码,但它似乎无法正常工作。
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来构建项目,那么我的标题现在已经构建好了。但是有一个问题:我在构建标题时发出的消息对出现了5次。这是为什么?我只想构建一次标题。
答案 0 :(得分:2)
我终于找到了办法。我在qmake中使用add my own compiler的可能性并从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中编译,则会构建标头并将gen_headers.name
的内容作为输出发出。