尽管使用了 -I 选项,但未找到标头
Posted
技术标签:
【中文标题】尽管使用了 -I 选项,但未找到标头【英文标题】:Header not found despite the use of the -I option 【发布时间】: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,我不明白它们为什么消失了......
【问题讨论】:
我无法重现这个。也许你可以给我们一个最小的完整例子...... 【参考方案1】:它的CFLAGS
需要 -I 选项用于构建的编译阶段。检查 B makefile 是否使用适当的 -I 选项设置了 CFLAGS。
LDFLAGS
只会影响链接器选项。
【讨论】:
好吧,我在规则中添加了 $(LDFLAGS),它应该会影响 .o 的编译,不是吗?但是我尝试在 CFLAGS 中添加这些 -I 选项,但我仍然有错误。还是谢谢!以上是关于尽管使用了 -I 选项,但未找到标头的主要内容,如果未能解决你的问题,请参考以下文章