我有一个项目,其中包含不同目录中的文件。目录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,我不明白他们为什么会消失......
答案 0 :(得分:0)
它的CFLAGS
需要-I选项用于构建的编译阶段。检查B makefile是否使用相应的-I选项设置了CFLAGS。
LDFLAGS
只会影响链接器选项。