2014-10-16 67 views
0

我有大量的小C程序(所有單個.c文件),我想將它們全部構建到單獨的可執行文件中。也就是說,prog-01.c,prog-02.c等應該單獨構建,結果應該是該程序的單個可執行文件。在makefile中批量構建源代碼

我在makefiles中使用通配符相對比較新,我很感謝一些幫助。這是我到目前爲止已經完成:

CC = gcc 
CFLAGS = -g -Wall -Werror 

SRCS:=$(wildcard *.c) 
OBJS:=$(SRC:.c=.bin) 

all-gcc: $(SRCS) 
    $(CC) $(CFLAGS) $(SRCS) -o $(OBJS) 

run-%-gcc: prog-%-gcc 
     @./$(<) 

prog-%-gcc: prog-%.c 
     $(CC) $(CFLAGS) $< -o [email protected] 

clean: 
    @rm *.o 

回答

1

如果我走這條路,我可能會使用:

CC  = gcc 
CFLAGS = -g -Wall -Werror 

SRCS := $(wildcard *.c) 
PROGS := $(SRCS:.c=) 
OBJS := $(SRCS:.c=.o) 

all: $(PROGS) 

clean: 
    rm -f $(OBJS) $(PROGS) 

這每一個文件program.c轉換成可執行program,使用默認規則從C源文件構建一個程序。

+0

哇,這很好!你能詳細解釋一下這裏發生了什麼嗎? – audiFanatic 2014-10-17 04:48:41

+0

你知道通配符是如何工作的,生成一個以'.c'結尾的文件名列表。下一個分配會創建一個名稱列表,其中'.c'後綴被一個空字符串替代,有效地刪除'.c'。這些被認爲是製作的節目。當然,'make'知道如何從一個C源文件創建一個程序。當所有程序都是最新的時候,所有的目標都是最新的。因此,標準的內置規則負責所有的艱苦工作。 OBJS宏包含目標文件名,假設你在Unix上。 'clean'目標刪除程序和目標文件。 – 2014-10-17 05:31:59

+0

啊,這就是我沒有得到的;我沒有意識到make可以自動構建沒有明確規則的東西。在那種情況下,我將如何修改這個以使用明確的規則?我需要制定另一條規則來同時運行所有這些規則?使用'./$(PROGS)'只運行第一個程序,然後將其他參數作爲參數。 – audiFanatic 2014-10-17 14:46:34