Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在qmake中编译之前,如何使用可执行文件构建多个头文件?_C++_Qt_Qmake - Fatal编程技术网

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

C++ 在qmake中编译之前,如何使用可执行文件构建多个头文件?,c++,qt,qmake,C++,Qt,Qmake,我找到了一些方法(比如)在编译任何其他东西之前如何运行一个脚本来构建一个目标 我似乎不了解整个概念。我不知道如何在编译前,调用脚本/可执行文件来生成多个目标(几个C++头文件),因为我需要这些生成的头文件来编译。 简单地说,我会做如下事情: GENERATOR= \dist\gen_headers.exe BUILD_SOURCES+= header1.h header2.h header3.h header1.h header2.h header3.h: headers.h.in $(GE

我找到了一些方法(比如)在编译任何其他东西之前如何运行一个脚本来构建一个目标

我似乎不了解整个概念。我不知道如何在编译前,调用脚本/可执行文件来生成多个目标(几个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:

我尝试在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。如果我试图编译,我会得到一个类似的错误
没有这样的文件或目录
。我的回音输出从未显示。那么我做错了什么

编辑2

嗯,我发现了。我从edit1中删除了内容,并在
INCLUDEPATH
语句之前添加了以下内容

message(Building headers...)
system(dist\gen_headers.exe headers.h.in):message(Done building headers.)
# 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

如果我调用qmake来构建项目,那么现在就可以构建我的头了,这很好。但有一个问题:我在构建标题时发出的一对消息出现了5次。为什么呢?我只想构建一次标题。

我终于找到了一种方法。我在qmake to中使用了可能性,并从中获得了灵感

我在contains语句之前添加了以下几行

message(Building headers...)
system(dist\gen_headers.exe headers.h.in):message(Done building headers.)
# 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
的内容作为输出发布。

在您的文章中链接的同一篇文章之后,您可以对多个目标执行类似操作:
QMAKE_EXTRA_targets+=targetlib1 targetlib2
PRE_TARGETDEPS=EXTRA 1 EXTRA 2
。这就是你想做的吗?@Azeem不,这不是我想要的。我的可执行文件通过一个调用生成所有三个目标。也许这个答案可以帮助您:
system()
由qmake运行,而不是make(显然不止一次,因此您的5个调用?),因此您不会在每次构建项目时更新标题(但只有在再次运行qmake时)@ymoreau那么您有没有建议如何使用pro文件通过make发出此命令?