【问题标题】:Header not found despite the use of the -I option尽管使用了 -I 选项,但未找到标头
【发布时间】:2013-07-19 10:34:02
【问题描述】:

我有一个项目,其中包含不同目录中的文件。目录 A 包含两个目录 B 和 C,C 包含一个目录 D。文件位于 B、C 和 D 中。我编写了 makefile 来编译它,主 makefile 在 C 中。 C Makefile 包含以下行:

export LDFLAGS = -I ../B -I . -I ../C/D -lm

(起初我只写了“./D”而不是“../C/D”,但后来因为我得到的错误而改变,只是为了确保路径对 B 也有效。但是它没有改变任何东西)

B 中的 makefile 包含以下规则:

%.o : %.c
    $(CC) $(CFLAGS) -o $@ -c $< $(LDFLAGS)

当我运行“make”时,出现错误,因为 B 中的文件包含 D 中的文件,但它没有找到该文件。为什么 ?感谢您的帮助!

编辑:当我使用 -I 选项添加目录时,我得到完全相同的错误(相同的 B 头文件中包含相同的缺失文件),然后当我的 B makefile 上有 LDFLAGS 时,我没有请注意生成此错误更改的文件:现在它是一个 .cpp 文件,其中包含引起错误的 B 标头(包括 D 标头)。 (顺便问我为什么c文件中只有一个cpp文件,不是我开发的……) B makefile中cpp文件的行是:

%.o : %.cpp
    g++ $(CFLAGS) -o $@ -c $< $(LDFLAGS)

但是这个 .cpp 文件的 .o 不在 all 规则上(它调用 $(OBJS),定义为 OBJS = $(SRC:.c=.o))。我想这是我的错误。因为当我运行make时,它首先进入B目录并使用选项编译我的c文件,然后离开目录,因为规则:

b : 
    @(cd $(BDIR) && $(MAKE))

所以,当 make 意识到需要 myccpfile.o 时,他神奇地调用了这行代码

g++    -c -o ../B/myccpfile.o ../B/mycppfile.cpp

所以现在我真的不明白这个调用来自哪里,这真的很奇怪,因为使用 g++ 的唯一规则有 CFLAGS 和 LDFLAGS,我不明白它们为什么消失了......

【问题讨论】:

  • 我无法重现这个。也许你可以给我们一个最小的完整例子......

标签: c gcc makefile include


【解决方案1】:

它的CFLAGS 需要 -I 选项用于构建的编译阶段。检查 B makefile 是否使用适当的 -I 选项设置了 CFLAGS。

LDFLAGS 只会影响链接器选项。

【讨论】:

  • 好吧,我在规则中添加了 $(LDFLAGS),它应该会影响 .o 的编译,不是吗?但是我尝试在 CFLAGS 中添加这些 -I 选项,但我仍然有错误。还是谢谢!
猜你喜欢
  • 2021-10-27
  • 2017-09-29
  • 2018-11-27
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多