g ++ -MG标志的意外行为

时间:2014-09-25 18:11:12

标签: c++ gcc makefile g++

我有main.cpp个文件,我想为其生成依赖文件main.d(包含在Makefile中)。

我正在呼叫g++ -MM -MF src/main.d -MP -MT src/main.o src/main.cpp。它工作正常,除非我有一些源生成器。我为此找到了-MG标志,但它并没有像我预期的那样起作用。

例如:main.cpp包括module/mod.h#include "module/mod.h")和mod.h包括generator/gen.h#include "generator/gen.h"),gen.h是产生。有以下结构:

-Makefile
-src
--main.cpp
--module
---mod.h
---generator
----gen.h

Makefile我有一条规则来生成src/module/generator/gen.h

g++现有文件的依赖关系生成是正确的:

src/main.o: src/module/mod.h

但对于不存在的文件gen.h依赖只是generator/gen.h

如果我在生成依赖项之前生成此文件,则它是正确的src/module/generator/gen.h

g++是否还有其他选项可以正确生成不存在的文件的依赖项?

main.d不存在时生成的

gen.h

src/main.o: src/module/mod.h generator/gen.h

纠正main.d存在时生成的gen.h

src/main.o: src/module/mod.h src/module/generator/gen.h

1 个答案:

答案 0 :(得分:1)

如man gcc所述

  

依赖文件名直接取自“#include”指令而不预先添加路径

实际上gcc无法知道真正的路径。 我建议你修复include语句以保持包含路径与make路径同步,即mod.h中的白色

#include <module/generator/gen.h>

Makefile添加到src并为gcc添加正确的-I标志,例如

SRCDIR := $(shell pwd)
CXXFLAGS += -I$(SRCDIR)

总是从一些“源根”

开始所有非本地包含是一个好习惯