我有 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
当gen.h
存在时正确生成main.d
:
src/main.o: src/module/mod.h src/module/generator/gen.h
最佳答案
如 man gcc 中所述
The dependency filename is taken directly from the "#include" directive without prepending path
实际上,gcc 无法知道真实路径。
我建议您修复 include 语句以使包含路径与 make 路径保持同步,即 mod.h
#include <module/generator/gen.h>
将 Makefile
放入 src
并向 gcc 添加适当的 -I 标志,例如
SRCDIR := $(shell pwd)
CXXFLAGS += -I$(SRCDIR)
始终从某个“源根目录”启动所有非本地包含是一个好习惯
关于c++ - g++ -MG 标志的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26045315/