尽管使用了-I选项,仍未找到标头

时间:2013-07-19 10:34:03

标签: c gcc makefile include

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

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

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

B中的makefile包含以下规则:

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

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

编辑:当我使用-I选项添加目录时,我得到完全相同的错误(同一B头文件中包含相同的丢失文件),然后当我在我的B makefile上有LDFLAGS时,我没有'注意生成此错误的文件发生了变化:现在它是一个包含B头的.cpp文件,其中包含引发错误的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 个答案:

答案 0 :(得分:0)

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

LDFLAGS只会影响链接器选项。