【发布时间】:2017-04-11 11:06:21
【问题描述】:
这是我想出的或多或少通用的 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) 中删除所有包含 main 函数的源文件的目标文件,如下所示:
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
虽然它似乎确实有效,但我想知道是否有更优雅的方法可以实现相同的结果,而不必为每个可执行文件复制行。此外,在两个可执行文件的链接步骤中,所有目标文件都被使用,即使是那些不需要的文件(它可能会引入错误?)。
【问题讨论】:
-
如果您不想明确列出源文件(即没有通配符),那么 make 可能不是正确的工具。查看更新的构建工具,例如 cmake。
-
Err... cmake 要求您明确列出源文件;甚至没有通配符的 option 。所以你的评论对我来说没有意义。