"g ++ -MMD"比包括扫描更好吗?

ACy*_*lic 4 dependencies gcc include icc

在查看构建系统时,很多(SCons,bjam,cmake,Tundra等)都有内置的#include扫描程序.然而,gcc和icc提供了一个-MMD(或-MD)选项,它输出C++文件所依赖的头文件的名称.

-MMD依赖的选择似乎是可靠的.如果添加#include到C文件,其时间戳将更改,以便构建系统重新编译它.如果#include向头文件添加a ,则其时间戳将更改,并且将重新编译所有受影响的C文件.

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

Jon*_*ely 6

-MMD 最好,因为你给出的原因和更多.

让编译器在正常编译过程中输出依赖项可确保完全相同的编译器选项集(如-I路径和宏)对编译和查找依赖项有效.与确保将两个单独的工具使用相同的选项相比,这更不冗余且更不容易出错.

  • MMD的一个小问题包括列表:当你#include <foo.h>时,它会查看所有-I include dirs.如果有两个foo.h文件,则会读取第一个文件.因此,如果向搜索列表中较早的-I includedir添加具有相同名称的新头文件,则依赖于-MMD将会中断. (2认同)
  • @underscore_d它的错误并不重要:使用`-M`是一个陷阱,值得一提. (2认同)
  • 我不知道如何使用`-M`是一个陷阱,而不是在makefile _at all_中列出先决条件头的陷阱.如果您手动在makefile中列出标题先决条件,是否会出现完全相同的问题?添加第二个`<foo.h>`可能会完全破坏你的编译,如果没有,那么使用`-MMD`不会"破坏"任何东西,它只是意味着先决条件是不正确的,直到编译器运行再次在源文件上. (2认同)