2016-11-27 67 views
0

这里是或多或少通用的Makefile我想出了。它所做的是,它会检查所有的源文件,产生依赖性并创建可执行文件执行exec(相应的源文件的名字命名)。显然,每个文件都在一个文件夹中。通用Makefile文件自动make依赖于多个可执行文件

CC=gcc 
CFLAGS= 
LDLIBS= 

BIN=exec 

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

all: makefile.dep $(BIN) 

$(BIN): $(OBJ) 

makefile.dep: $(SRC) 
    gcc -MM $^ > [email protected] 

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 $^ > [email protected] 

include makefile.dep 

.PHONY: all 

虽然它似乎工作,我不知道是否有一个更例如,可以实现相同的结果,而不必为每个可执行文件重复行。另外,在两个可执行文件的链接步骤中,都使用了所有的目标文件,甚至是不需要的文件(它可能引入错误?)。

+0

如果您不希望要明确列出的源文件(即不带通配符),然后*做*可能是不正确的工具。查看更新的构建工具,如* cmake *。 – sapanoia

+0

错误... cmake需要您明确列出源文件;甚至没有通配符_option_。所以你的评论对我没有意义。 – MadScientist

回答

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) 

还有其他的方法来做到这一点的地段。这只是一个简单的方法。如果你只有少数这些,你可以保持简单。如果你开始有很多它们,可能需要更复杂的东西。