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

标签 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.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 命令时,它返回以下错误消息:

Assembler messages: Fatal error: can't create obj/main.o: No such file or directory

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

最佳答案

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

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

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

关于编译所有 C 文件并使用 Makefile 创建可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52226852/

相关文章:

c - 如何检查 RFID 标签的校验和

c - 有没有办法将多个值作为 C 中定义的单个宏值传递给宏函数?

c - GCC:将结构归零

linux - Hello world kconfig 和 makefile 使其类似于 linux 内核 menuconfig

c - 使用安全函数将字符串添加到 C 中的字符串

c - gdb 信息行 : . ..但不包含任何代码

macos - Mac 上的 Makefile 自动完成

c - 对 `printf' 的 undefined reference

c - 允许在 Swift 中使用 C 函数的桥接 header 失败

gcc - 尝试在 GCC 中使用地址清理程序时出现 "undefined reference"错误