在 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 的内容作为输出发出。