我有一个项目的文件在不同的目录。目录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 makefile上添加LDFLAGS时,我得到了完全相同的错误(相同的B头文件上包含了相同的丢失文件),我没有注意到生成此错误更改的文件:现在是一个包含B头和D头的。cpp文件引发了此错误。(不要问我为什么c文件中有一个cpp文件,顺便说一下,不是我开发的。。。)B makefile中cpp文件的行如下:
%.o : %.cpp
g++ $(CFLAGS) -o $@ -c $< $(LDFLAGS)
但是这个。cpp文件的。o不在all规则上(it调用(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,我不明白为什么它们消失了。
它的