这是我想出的或多或少的通用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
虽然它确实有效,但我想知道是否有更优雅的方法可以实现相同的结果,而不必为每个可执行文件重复行。此外,在两个可执行文件的链接步骤中,使用了所有目标文件,甚至是不需要的文件(它可能会引入错误?)。
答案 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)
有很多其他方法可以做到这一点。这只是一种直截了当的方式。如果你只有其中的一小部分,你可以保持简单。如果你开始有很多它们,那么可能需要更复杂的东西。