【问题标题】:Compiling all C files and creating executable with Makefile编译所有 C 文件并使用 Makefile 创建可执行文件
【发布时间】:2018-09-07 17:02:43
【问题描述】:

我有一个 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:没有这样的文件 或目录

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

【问题讨论】:

  • 您将源代码分布在目录树中而不是全部在同一个目录中,同时尝试编写一个 动态Makefile /i> 发现并构建所有源。这并没有超出 GNU make 的能力范围,但是您为使其工作所付出的努力可能最好花在以不同的方式解决问题上。
  • 替代方法包括将所有源代码手写到 Makefile 中(可能在ls 命令的输出中使用管道),或者至少制作所有子目录的静态列表,或者在每个子目录中设置一个单独的 Makefile 并执行一个很好的旧递归 make
  • 还有更好的方法来保持源目录干净,例如设置和执行 VPATH 构建。

标签: c gcc makefile


【解决方案1】:

似乎你在每一步之后rm -rf obj/,但没有mkdir -p obj/ 可以替换它。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多