2012-08-24 29 views
4

虽然看着构建系统,但它们中的很多(SCons,bjam,cmake,Tundra等)都有一个内置的#include扫描器。然而gcc & icc提供-MMD(或-MD)选项,它输出C++文件依赖的头文件的名称。“g ++ -MMD”比包含扫描更好吗?

-MMD依赖项选项似乎是可靠的。如果将一个#include添加到C文件中,其时间戳将会更改,以便构建系统重新编译它。如果您将一个#include添加到头文件,它的时间戳会改变,它会重新编译所有受影响的C文件。

包含扫描系统中断,但-MMD在我看来是强健的。哪个最好,为什么?

回答

4

-MMD是最好的,因为你给的原因和更多。

使编译器输出依赖关系作为正常编译过程的一部分,可确保编译和找到依赖关系时,有一组完全相同的编译器选项,例如-I路径和宏。与确保为两个单独的工具使用相同的选项相比,这种冗余性较低且不易出错。

+0

谢谢。你知道为什么所有这些工具都有#include扫描功能吗? – ACyclic

+1

不是每个人都使用gcc(或icc),而旧版本的gcc只在'-MD'输出中包含文件名而不是完整的路径名,例如'foo.o:'而不是'dir1/dir2/foo.o' –

+1

MMD的一个小问题包括列表:当你#include 它会查看所有-I包括目录。如果有两个foo.h文件,它会读取第一个文件。因此,如果您在搜索列表中的前面添加一个具有相同名称的新头文件,则依赖于-MMD将会中断。 – ACyclic