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

问题描述 投票:1回答:1

我有一个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.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)

但这似乎没有按预期工作,因为当我发出make命令时,它返回以下错误消息:

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

任何想法如何实现我想要的?

c gcc makefile
1个回答
1
投票

在每一步之后你似乎都是rm -rf obj/,但是没有mkdir -p obj/来取代它。

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

PS:你的输出被命名为build而不是main,因为这是你给它的名字......

© www.soinside.com 2019 - 2024. All rights reserved.