如何在编译qmake之前使用可执行文件构建多个头文件?

问题描述:

我发现了一些方法(如Qt run script before make)在编译其他任何东西之前如何运行构建一个目标的脚本。如何在编译qmake之前使用可执行文件构建多个头文件?

我似乎没有得到整个概念。我不知道如何通过在编译所有内容之前调用脚本/可执行文件来制作多个目标(多个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。我的回显输出从不显示。那么我做错了什么?

EDIT 2

好吧,我发现system(command)。我删除了编辑1中的内容,并在INCLUDEPATH陈述之前添加了以下内容。

message(Building headers...) 
system(dist\gen_headers.exe headers.h.in):message(Done building headers.) 

我的头文件现在构建,如果我打电话给qmake来构建项目,这样很好。但是有一个问题:我在构建标题时出现的那对消息出现了5次。这是为什么?我只想构建标题一次。

+0

遵循您在帖子中链接的相同文章,您可以为多个目标执行如下操作:'QMAKE_EXTRA_TARGETS + = targetlib1 targetlib2'和'PRE_TARGETDEPS = extra1 extra2'。这是你想要做的吗? – Azeem

+0

@Azeem不,这不完全是我想要的。我的可执行文件通过一次调用生成全部三个目标 – Lilo

+0

也许这个答案可以帮助你:https://*.com/a/3626970/6165833 – ymoreau

我终于找到了一种方法。我在qmake中使用了add my own compiler的可能性,并从here得到灵感。

我在包含语句之前添加了以下几行。现在

# 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内容已作为输出。