0

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

4

1 回答 1

0

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

LDFLAGS只会影响链接器选项。

于 2013-07-19T10:40:08.873 回答