具有自动make依赖关系的通用Makefile,用于多个可执行文件

时间:2016-11-27 18:14:04

标签: c makefile

这是我想出的或多或少的通用Makefile。它的作用是检查所有源文件,生成依赖项并创建可执行文件exec(以相应的源文件命名)。显然,每个文件都在一个文件夹中。

CC=gcc
CFLAGS=
LDLIBS=

BIN=exec

SRC=$(wildcard *.c)
OBJ=$(SRC:.c=.o)

all: makefile.dep $(BIN)

$(BIN): $(OBJ)

makefile.dep: $(SRC)
    gcc -MM $^ > $@

include makefile.dep

.PHONY: all

我想要的是以某种方式扩展这个Makefile来处理main的多个定义。我想我要做的是从$(OBJ)中删除包含主函数的所有源文件的目标文件,如下所示:

CC=gcc
CFLAGS=
LDLIBS=

BIN=exec
BIN2=toto

SRC=$(wildcard *.c)
JOBS=$(SRC:.c=.o)
JOBS:=$(filter-out $(BIN).o,$(OBJ))
JOBS:=$(filter-out $(BIN2).o,$(OBJ))

all: makefile.dep $(BIN) $(BIN2)

$(BIN): $(OBJ)
$(BIN2): $(OBJ)

makefile.dep: $(SRC)
    gcc -MM $^ > $@

include makefile.dep

.PHONY: all 

虽然它确实有效,但我想知道是否有更优雅的方法可以实现相同的结果,而不必为每个可执行文件重复行。此外,在两个可执行文件的链接步骤中,使用了所有目标文件,甚至是不需要的文件(它可能会引入错误?)。

1 个答案:

答案 0 :(得分:0)

通常使用wildcard查找源文件是个坏主意。您应该在makefile中显示要明确构建的文件列表。它不容易出错,并且人们不经常添加新的源文件,因此更新makefile是一件非常麻烦的事。

您可以使用:

exec_SRC = exec.c foo.c bar.c
toto_SRC = toto.c biz.c baz.c

all: exec toto

exec: $(exec_SRC:.c=.o)
toto: $(toto_SRC:.c=.o)

有很多其他方法可以做到这一点。这只是一种直截了当的方式。如果你只有其中的一小部分,你可以保持简单。如果你开始有很多它们,那么可能需要更复杂的东西。