我有一个项目,文件位于不同的目录中。目录 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,我不明白它们为什么消失了......