【问题标题】:Unexpected behavior of g++ -MG flagg++ -MG 标志的意外行为
【发布时间】:2014-09-25 18:11:12
【问题描述】:

我有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

【问题讨论】:

    标签: c++ gcc makefile g++


    【解决方案1】:

    如 man gcc 中所述

    依赖文件名直接取自“#include”指令,不加路径

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

    #include <module/generator/gen.h>
    

    Makefile 放入src 并将适当的-I 标志添加到gcc,例如

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

    始终从某个“源根”启动所有非本地包含是一个好习惯

    【讨论】:

    • 为什么没有办法知道真正的路径?如果目录“a/b/c”中的文件是#include "d/e.h" 文件e.ha/b/c/d/e 目录中?所以很容易确定 "" 包含的完整路径。
    • 那是因为 -I(或 -iquote)开关 - 您可以扫描 10 个目录以查找包含文件,除非文件存在,否则无法确定
    • 我建议你试试 cmake。我不喜欢它,但它解决了这个特殊问题 - 您将明确提供名称 threre
    • 好吧,我一直以为-I是为了<...>包含。
    • 只是为了澄清 <..> 和 ".." 对于历史记录的微妙之处 -- <...> 和 "..." 搜索路径都使用 -I 设置,而只有 ". .." 搜索路径由很少遇到的 -iquote 设置。 <..> 包含系统包含文件夹(如 /usr/include),而“..”包含包含源文件所在的目录
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2015-11-19
    • 2021-05-25
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多