C 用于多个源的makefile

C 用于多个源的makefile,c,makefile,C,Makefile,在学习makefile时,我试图为多个源目录编写一个make文件,但似乎在某些地方我错了 以下是我的代码结构: directory ├── common │   └── fun2.c ├── inc │   └── fun.h └── src ├── fun1.c └── main.c 这是我的makefile: CC= cc CFLAGS = -c -Iinc/ SOURCE=fun1.c\ main.c\ common\fun2.c OBJEC

在学习makefile时,我试图为多个源目录编写一个make文件,但似乎在某些地方我错了

以下是我的代码结构:

directory
├── common
│   └── fun2.c
├── inc
│   └── fun.h
└── src
    ├── fun1.c
    └── main.c
这是我的makefile:

CC= cc 
CFLAGS = -c -Iinc/
SOURCE=fun1.c\
       main.c\
       common\fun2.c
OBJECTS=$(SOURCE:.c=.o)
EXECUTABLE=hello
all: $(EXECUTABLE)
$(EXECUTABLE):$(OBJECTS)
    $(CC) -o $@ $(OBJECTS)
.c.o:
    $(CC) $(CFLAGS) $< 
clean:
    rm -rf *o hello 
CC=CC
CFLAGS=-c-Iinc/
SOURCE=fun1.c\
main.c\
通用\fun2.c
对象=$(源:.c=.o)
可执行文件=你好
全部:$(可执行)
$(可执行文件):$(对象)
$(CC)-o$@$(对象)
.c.o.:
$(CC)$(CFLAGS)$<
清洁:
rm-rf*o你好
我在运行makefile时出错

找不到从依赖项创建目标公用\fun2.o的规则。
有人能指出这里的错误吗

您的
.c
源不在
目录
,而是在
目录/src
中。因此,解决方案是:

SOURCE=src/fun1.c src/main.c common/fun2.c
.c.o:
规则是不必要的。或者,修复要输出到正确目录的规则:

.c.o:
    $(CC) -o $@ $(CFLAGS) $< 
CC=CC
CFLAGS=-c-Iinc/
SOURCE=src/fun1.csrc/main.c common/fun2.c
对象=$(源:.c=.o)
可执行文件=你好
全部:$(可执行)
$(可执行文件):$(对象)
$(CC)-o$@$(对象)
.c.o.:
$(CC)$(CFLAGS)$<
.骗子:都是干净的
清洁:
rm-rf*o你好

您使用的是什么环境(操作系统和工具链)?在Linux上,目录以正斜杠“/”而不是反斜杠“\”分隔,因此您可以尝试更改它。如果我是正确的,“make”没有看到名为“common\func2.c”的文件,因此它不知道如何生成“common\func2.o”,因为我正在使用unix aixUNIX使用正斜杠。尝试并改变这一点,它应该会有所帮助。感谢Maxim的建议,但在这样做的同时,common/fun2的对象文件,c在src/目录中生成,导致生成可执行文件hellomake all-f Makefile.mak cc-c-Iinc/main.c cc-c-Iinc/fun1.c cc-c-Iinc/common/fun2.c cc-o hello main.o fun1.o common/fun2.o cc:1501-228输入文件common/fun2.o未找到时出现未找到错误。情况不应如此。您的对象将是
src/fun1.o src/main.o common/fun2.o
@BMM为您更新了编译规则。非常感谢它的运行。问这个问题是非常愚蠢的,因为我是一个新手,如果你能解释一下所有的目标和清洁应该是什么,那就好了。虚假,即:。虚假:所有清洁虽然这个代码片段是受欢迎的,可能会提供一些帮助,但它将是如何解决这个问题的。如果没有这些,你的答案就没有什么教育价值——记住,你是在将来为读者回答这个问题,而不仅仅是现在提问的人!请在回答中添加解释,并说明适用的限制和假设。
.PHONY: all clean
CC= cc 
CFLAGS = -c -Iinc/
SOURCE= src/fun1.c src/main.c common/fun2.c
OBJECTS=$(SOURCE:.c=.o)
EXECUTABLE=hello
all: $(EXECUTABLE)
$(EXECUTABLE):$(OBJECTS)
    $(CC) -o $@ $(OBJECTS)
.c.o:
    $(CC) $(CFLAGS) $< 
.PHONY: all clean
clean:
    rm -rf *o hello