2013-05-25 74 views
5

我正在嘗試編寫一個使用宏從一個文件中創建多個可執行文件的makefile。我試着搜索以前回答的問題,但是,因爲我對C編程以及使用gcc非常新,所以我無法找到我的問題的答案。具有多個可執行文件的Makefile

這是我到目前爲止有:

CC=gcc 
CFLAGS=-I. 
OBJ = ex1.c ex3.c 
EXECUTABLE = ex1 ex3 

$(EXECUTABLE): $(OBJ) 
    gcc -o [email protected] $^ $(CFLAGS) 

clean: 
    rm -f $(EXECUTABLE) 

我想行

$(EXECUTABLE): $(OBJ) 

分別創建文件ex1.c中ex3.c可執行EX1和EX3。

回答

11

對於這種特殊情況下,如果每個可執行文件與.c擴展一個源文件,你需要的是一個行的Makefile:

all: ex1 ex3 

內置了make默認的規則,那麼工作已經:

$ make 
cc -O2 -pipe ex1.c -o ex1 
cc -O2 -pipe ex3.c -o ex3 

幕後,make使用POSIXly mandated built-in single suffix rule

.c: 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $< 

根據您的喜好,使用make CC=gcc CFLAGS=-O2 LDFLAGS=-s和類似命令改變命令。

花絮一天:其實,如果你願意來命名目標調用make時,您可以使用空甚至運行沒有任何的Makefile:

$ make -f /dev/null CC=gcc CFLAGS=-O2 LDFLAGS=-s ex1 ex3 
gcc -O2 -s ex1.c -o ex1 
gcc -O2 -s ex3.c -o ex3 
$ rm -f Makefile ex1 ex3 
$ make CC=gcc CFLAGS=-O2 LDFLAGS=-s ex1 ex3 
gcc -O2 -s ex1.c -o ex1 
gcc -O2 -s ex3.c -o ex3 

使魔!

作爲一個經驗法則,不要重新發明輪子(或規則),使用已經存在的規則。它簡化了你的生活並使其成爲了很多。這使得小和性感的makefiles打動女士們:-)

+2

Upvote for makefile magic! – Gui13

+1

非常有幫助!感謝您瞭解make命令的內部工作原理。 – Raeven

1

你靠近,但你需要的圖案規則:

$(EXECUTABLE): % : %.c 

然後默認規則,使之既建:

all: $(EXECUTABLE) 
+1

像這樣的模式規則是它會出現的GNUism。 '.c'後綴的內置單個後綴規則已經實現了。 – Jens

+0

我正在研究模式規則。謝謝。 – Raeven

2

的幾點建議(假設你使用GNUmake,而不是別的)

首先,運行一次make -p,你就會明白內建規則make正在認識。尋找特別是COMPILE.cLINK.c

然後,我建議

CFLAGS= -g -Wall -I. 

(因爲你真的想-g進行調試,並-Wall得到最警告)

而且你可能不需要

$(EXECUTABLE): $(OBJ) 
    gcc -o [email protected] $^ $(CFLAGS) 

但是,我建議ST之前大多數其他規則添加

.PHONY: all clean 

all: $(EXECUTABLES) 

其實,我想編寫你的Makefile(用於GNUmake!)如下

# file Makefile 
CC= gcc 
RM= rm -vf 
CFLAGS= -Wall -g 
CPPFLAGS= -I. 
SRCFILES= ex1.c ex2.C## or perhaps $(wildcard *.c) 
OBJFILES= $(patsubst %.c, %.o, $(SRCFILES)) 
PROGFILES= $(patsubst %.c, %, $(SRCFILES)) 

.PHONY: all clean 

all: $(PROGFILES) 
clean: 
    $(RM) $(OBJFILES) $(PROGFILES) *~ 
## eof Makefile 

記住標籤是顯著字符Makefile -s (動作部分rules)。在這個答案中,至少應該以四個空格開頭的行應該以標籤字符開頭。

一旦一切都被調試,考慮運行make clean清理所有內容,然後make -j CFLAGS=-O2 all通過優化並行編譯所有內容。

最後,我建議使用remake和運行remake -x調試複雜Makefile -s

當然,我假設你的目錄只有單一的文件程序。

順便說一句,還有其他的建設者計劃。也許你可能會考慮使用omake

不要忘了使用版本控制系統,如git作爲源文件。現在是學習這種工具的時候了。

+0

'COMPILE.c'和'LINK.c'是GNUisms;你在這裏做的是OP使用GNU make的詭計。更好的(可移植的)想法是爲'.c'使用內置的單個後綴規則。 – Jens

+0

是的,我加了一句GNU make –

+0

謝謝你的建議以及建議git和omake。 – Raeven

0

以下答案包括多個可執行文件,如啓動,process1,process2,...,process4。

LOCAL_INCLUDE=./ 

all: clean process_first process_second init 

process_first: 
    gcc -g -o process1 -I$(LOCAL_INCLUDE) process1.c -lzmq -L. -L./. 
    gcc -g -o process2 -I$(LOCAL_INCLUDE) process2.c -lzmq -L. -L./. 

process_second: 
    gcc -g -o process3 -I$(LOCAL_INCLUDE) process3.c -lzmq -L. -L./. 
    gcc -g -o process4 -I$(LOCAL_INCLUDE) process4.c -lzmq -L. -L./. 

init: 
    gcc -g -o initiate -I$(LOCAL_INCLUDE) initiate.c -lzmq -lconfig -lpthread -L. -L./. -ldl -lrt 

clean: 
    rm -rf init_manager.o init_manager 
    rm -rf process1 process2 process3 process4 

注意:這是一個很好的做法,在再次製作它們之前清理並觸摸所有可執行文件。

相關問題