【问题标题】:Make doesn't rebuild headers when changed更改时Make不会重建标题
【发布时间】:2012-05-25 03:36:34
【问题描述】:

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

供将来参考:

如果使用 QMake 系统:

依赖路径 += 。 \ 页眉位置1/\ 页眉位置2/\ 页眉位置 2/页眉子位置 1/\ 标头位置 2/标头子位置 2/\ 页眉位置2/页眉子位置3/\ 页眉位置 2/页眉子位置 4/\ 页眉位置 2/页眉子位置 5/\ 页眉位置3/\ 页眉位置 3/页眉子位置 1/\ 页眉位置 3/页眉子位置 2/\

【问题讨论】:

  • 奇怪的行为是我多年未修改的随机代码突然抛出错误,甚至库代码在自身内部抛出错误......
  • 听起来您缺少对标头的一些依赖项。
  • 注意事项:我的 make 文件是由 QMake 根据我的 Qt .pro 文件自动生成的。修改我的 Makefile 在某种程度上不是一种选择,因为当 .pro 文件更改时,会重新创建 Makefile。

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


【解决方案1】:

重新运行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

【讨论】:

  • 这就是答案!从 QMake 文件生成的 Makefile 在运行“make”并且新的头文件已添加到 QMake 文件时会自动更新。但是,如果此时新的头文件还没有包含在 .cpp 文件中,则不会计算依赖更新,之后需要手动重新运行 qmake。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    解决方案是在您的 makefile 中具有适当的头文件依赖项。

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

    【讨论】:

    • 已经好几年没用过了,makedepend 会严重拖慢你的编译速度……所以我会说尽可能远离
    【解决方案4】:

    对您的 IDE 一无所知,也不确定它是否相关,而且由于您没有包含您的 makefile - 我只是简单说明一下 - 您是否使用任何自动生成的依赖项?

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

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

    【讨论】:

    • 我相信你有最好的答案,因为它确实引导我阅读更多关于 QMake 的生成系统,以及如何在 Qt .pro 文件中设置依赖关系。
    【解决方案5】:

    这主要是文件之间的依赖造成的。因此,如果您更改包含在另一个文件中的 .h 文件,则该文件也需要重新编译。因此,您要么需要减少包含,要么尽可能以 .h/.cpp 形式进行编码,以使 .cpp 比 .h 更频繁地进行更改。

    【讨论】:

    • 附加说明,如果您在 make 系统中正确设置了依赖项,则不必每次都需要 make clean,而仅在更改 .h 文件中包含的内容时才需要。
    • 我的大部分工作都是在 .cpp 文件中完成的。但是,如果我需要向一个类添加一个新函数,或者添加一个新的私有变量,我必须在标题中进行更改。
    • 当然,由于依赖关系,任何包含此内容的内容都将被重新编译,因此减少文件之间的依赖关系会有所帮助。例如小心包含在 .h 文件中,这会导致在其他文件中创建依赖项。我通常尽量只包含在 .cpp 中。
    • 我的程序也是如此。我只在需要时#include
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多