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。