编译所有C文件并使用Makefile创建可执行文件

时间:2018-09-07 17:02:44

标签: c gcc makefile

我有一个C项目,该文件具有以下文件结构:

Makefile
src
 |-utils
 |   |--vic.c
 |   |--vic.h
 |-mod
 |  |--type.c
 |  |--type.h
 |-bb.c
 |-bb.h
 |-main.c

因此,在根目录下,我有实际的Makefilesrc目录,其中包括源文件。在src目录中,有多个.c.h文件以及main.c文件,还有其他目录也包含其他.c和{{ 1}}个文件。请注意,为简洁起见,上面显示的文件结构简短。我想创建一个.h,它将自动编译所有内容并生成可执行的Makefile程序,还删除在编译过程中生成的目标文件。目前,我有这样的事情:

main

但是这似乎没有按预期方式工作,因为当我发出CC=gcc CFLAGS= RM=rm -rf OUT=main SRC=src OBJ=obj SOURCES=$(wildcard $(SRC)/*.c) OBJECTS=$(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) all: build build: $(OBJECTS) $(CC) $(CFLAGS) $^ -o $@ $(RM) $(OBJ) $(OBJ)/%.o: $(SRC)/%.c $(CC) $(CFLAGS) -I$(SRC) -c $< -o $@ debug: CFLAGS+=-DDEBUG debug: build .PHONY: clean clean: $(RM) $(OBJ) $(OUT) 命令时,它会返回以下错误消息:

  

汇编程序消息:致命错误:无法创建obj / main.o:没有此类文件   或目录

有什么想法可以实现我想要的吗?

1 个答案:

答案 0 :(得分:1)

似乎每个步骤之后您rm -rf obj/,但是没有mkdir -p obj/可以替换。

由于GNU make本身会删除中间目标,所以我不明白您为什么会这么做$(RM) $(OBJ),但是您的%.o目标可能会有一行 mkdir -p "$(shell dirname "$@")" …以确保目标目录存在。

PS:您的输出名为build而不是main,因为这是您给它的名称…