Make在更改时不会重建标头

时间:2012-05-17 14:33:14

标签: c++ qt compilation makefile header-files

我有一个项目,我经常修改标题,当我这样做时,忘记make clean然后make,我会得到各种奇怪的行为。我目前正在使用Qt Creator作为我的IDE,但我已经看到这发生在一个独立于Qt的项目上。我的项目变得相当大,每次我更改标题时都必须重建,这种方法正变得无用。有什么想法吗?

供将来参考:

如果使用QMake系统:

DEPENDPATH += . \
    HeaderLocation1/ \
    HeaderLocation2/ \
    HeaderLocation2/HeaderSubLocation1/ \
    HeaderLocation2/HeaderSubLocation2/ \
    HeaderLocation2/HeaderSubLocation3/ \
    HeaderLocation2/HeaderSubLocation4/ \
    HeaderLocation2/HeaderSubLocation5/ \
    HeaderLocation3/ \
    HeaderLocation3/HeaderSubLocation1/ \
    HeaderLocation3/HeaderSubLocation2/ \

5 个答案:

答案 0 :(得分:5)

重新投放qmake 。这将生成一个具有适当依赖关系的新Makefile。

示例:

文件file.h如下所示:

#include "some.h"
#include "header.h"
#include "files.h"
...

file.cpp如下所示:

#include "file.h"
...

并拥有.pro

HEADERS += file.h some.h header.h files.h
SOURCES += file.cpp

将在生成的Makefile

中生成以下内容
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

答案 1 :(得分:3)

不了解您的IDE,也不确定它是否相关,并且因为您没有包含您的makefile - 我只是陈述显而易见的 - 您是否使用任何自动生成的依赖项?

对于g ++,我使用-MD标志,然后在makefile中包含$(wildcard bin/*.d)(取决于创建目标文件的位置,我的是'bin'创建的)

还要确保删除干净构建中的dep文件

答案 2 :(得分:2)

解决方案是在makefile中拥有正确的头依赖项。

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

答案 3 :(得分:1)

这主要是由文件之间的依赖关系引起的。因此,如果您更改包含在另一个文件中的.h文件,则还需要重新编译该文件。因此,您需要减少包含,或者以.h / .cpp形式进行编码,以便在.cpp中更频繁地进行更改.h。

答案 4 :(得分:1)

以下是我自己的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

别忘了在clean build

上添加delete * .d文件