C++ 使不';更改时不重新生成标头

C++ 使不';更改时不重新生成标头,c++,qt,compilation,makefile,header-files,C++,Qt,Compilation,Makefile,Header Files,我有一个项目,我经常修改标题,当我这样做的时候,忘记了make clean,然后make,我会有各种奇怪的行为。我目前正在使用QtCreator作为我的IDE,但我在一个独立于Qt的项目中看到过这种情况。我的项目变得相当大,每次修改页眉时都要重新构建,这将变得毫无成效。有什么想法吗 供日后参考: 如果使用QMake系统: DEPENDPATH += . \ HeaderLocation1/ \ HeaderLocation2/ \ HeaderLocation2/Head

我有一个项目,我经常修改标题,当我这样做的时候,忘记了
make clean
,然后
make
,我会有各种奇怪的行为。我目前正在使用QtCreator作为我的IDE,但我在一个独立于Qt的项目中看到过这种情况。我的项目变得相当大,每次修改页眉时都要重新构建,这将变得毫无成效。有什么想法吗

供日后参考:

如果使用QMake系统:

DEPENDPATH += . \ HeaderLocation1/ \ HeaderLocation2/ \ HeaderLocation2/HeaderSubLocation1/ \ HeaderLocation2/HeaderSubLocation2/ \ HeaderLocation2/HeaderSubLocation3/ \ HeaderLocation2/HeaderSubLocation4/ \ HeaderLocation2/HeaderSubLocation5/ \ HeaderLocation3/ \ HeaderLocation3/HeaderSubLocation1/ \ HeaderLocation3/HeaderSubLocation2/ \ DEPENDPATH+=\ 校长职位1/\ 校长职位2/\ 标题位置2/标题子位置1/\ 标题位置2/标题子位置2/\ 标题位置2/标题子位置3/\ 标题位置2/标题子位置4/\ 标题位置2/标题子位置5/\ 校长职位3/\ 标题位置3/标题子位置1/\ 标题位置3/标题子位置2/\
这主要是由文件之间的依赖关系引起的。因此,如果更改另一个文件中包含的.h文件,则该文件也需要重新编译。因此,您需要减少include,或者在可能的情况下使用.h/.cpp格式进行编码,以便在.cpp中比在.h中进行更频繁的更改。

不了解您的IDE,也不确定它是否相关,而且由于您没有包括makefile,我只想说明一个明显的问题,您是否使用了任何自动生成的依赖项

对于g++我使用
-MD
标志,然后在makefile中包含
$(通配符bin/*.d)
(根据对象文件的创建位置,我的文件在“bin”中创建)


还要确保在干净的构建中删除dep文件。解决方案是在makefile中有适当的头依赖项

1) 使用makedepend生成依赖项文件。您将向makefile添加一个目标,该目标将重新生成依赖项文件,并且您希望在实际执行编译之前调用该目标。
2) 仅限GCC:在编译行中为.c/.cpp文件使用'-MMD'和'-MP'选项。这将导致GCC为输入文件生成依赖项文件。然后,您可以在makefile中包含这些内容。这里的优点是,使用这两个选项,当您添加和删除头时,它的行为应该与您预期的一样

这里是我自己的makefile的摘录,它生成并使用编译过程中自动创建的依赖项文件。您必须为cpp文件添加一个条目

%.o : %.c
    $(CC) -M $(CFLAGS) -o $*.P $<
    @cp $*.P $*.d; \
            sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
                -e '/^$$/ d' -e 's/$$/ :/' < $*.P >> $*.d; \
            rm -f $*.P
    $(CC) $(CFLAGS) -c $< -o $@

-include *.d
%.o:%.c
$(CC)-M$(CFLAGS)-o$*.P$<
@cp$*.P$*.d\
sed-e's/#.*/'-e's/^[^::::*:*/'-e's/*\\$$/'\
-e'/^$$/d'-e's/$$/:/'<$*.P>$*.d\
rm-f$*.P
$(CC)$(CFLAGS)-c$<-o$@
-包括*.d

不要忘记在干净的构建中添加删除*.d文件

重新运行
qmake
。这将生成一个新的Makefile,该Makefile将具有适当的依赖关系

例如:

文件
file.h
如下所示:

#include "some.h"
#include "header.h"
#include "files.h"
...
#include "file.h"
...
file.cpp
如下所示:

#include "some.h"
#include "header.h"
#include "files.h"
...
#include "file.h"
...
您的
.pro

HEADERS += file.h some.h header.h files.h
SOURCES += file.cpp
将在生成的
生成文件中生成以下内容:

file.o: ../src/file.cpp ../src/file.h \
        ../src/some.h \
        ../src/header.h \
        ../src/files.h
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o file.o ../src/file.cpp

奇怪的行为是,我很久没有修改过的随机代码突然抛出错误,甚至库代码本身也抛出错误……听起来你缺少了一些对头的依赖性。需要注意的是:我的make文件是由QMake根据我的Qt.pro文件自动生成的。修改我的Makefile在某种程度上不是一个选项,因为当.pro文件更改时,会重新创建Makefile。另外一个注意事项是,如果在make系统中正确设置了依赖项,则不必每次都进行清理,而只需更改.h文件中包含的内容。我的大部分工作都是在.cpp文件中完成的。但是,如果我需要向类中添加新函数,或者添加新的私有变量,我必须在标题中更改它。当然,由于依赖关系,任何包含此项的内容都将重新编译,因此减少文件之间的依赖关系会有所帮助。例如,小心不要不必要地将文件包含在.h中,这会导致在其他文件中创建依赖关系。我通常尽量只在可能的情况下加入.cpp。对于我的程序也是如此。我只在需要的时候才
#包括
。多年没有使用过它,
makedepend
会严重减慢编译速度。。。所以我想说,如果可能的话,请走开。我相信你有最好的答案,因为这确实让我读了更多关于QMake的生成系统,以及如何在Qt.pro文件中设置依赖项的内容。这就是答案!当运行“make”并向QMake文件添加新的头文件时,从QMake文件生成的Makefile会自动更新自身。但是,如果此时.cpp文件中尚未包含新的头文件,则不会计算依赖项更新,之后需要手动重新运行qmake。