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

标签 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.dgen.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/

相关文章:

c - 如何使用但不公开 c99 库中的内联函数?

go - 在 IntelliJ 中使用 File Watcher 运行 Makefile

makefile - 使所有规则都取决于 Makefile 本身

c - 使用内联组件绘制像素 VGA

c - 编译C文件时出现Unsupported x86-64 instruction set错误

c - Unix makefile 错误 : 'make: Fatal error: Don' t know how to make target '

c++ - 如何通过实例方法使用 C++11 线程?

c++ - Callback 类模板的实际用途是什么?

c++ - 在全局范围内调用静态方法

c++ - 疯狂计算器