2016-11-27 81 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) 

還有其他的方法來做到這一點的地段。這只是一個簡單的方法。如果你只有少數這些,你可以保持簡單。如果你開始有很多它們,可能需要更復雜的東西。