GNU 的專案建製工具 (Make)

GNU 程式設計

GNU 程式簡介

GNU 與 C 語言

gcc 編譯器

glibc 函式庫

make 建置

ld 連結器

as 組譯器

ar 函式庫

objdump

objcopy

訊息

相關網站

參考文獻

最新修改

簡體版

English

當程式越來越多時,編譯、連結與測試的動作會變得相當繁瑣,此時就必須使用專案建置工具。GNU 的 make 是專案編譯上相當著名的典型工具,在此,我們將用 make 來學習大型專案開發所需的專案管理技巧。並且透過make觀察大型專案的開發過程,讓讀者得以學習到專業的系統程式開發流程。

專案編譯工具make 是用來編譯專案的強有力工具,使用 make 工具可以有效的整合許多程式,並且進行快速的大型專案編譯動作。像是著名的 Linux 作業系統就是以 gcc 與 make 等 GNU 工具所建構出來的。因此,學習 GNU 工具更是進入 Linux 系統程式設計的捷徑。

對於初學者而言,可能會覺得make 的語法相當怪異,然而,對於有經驗的程式設計人員而言,卻會覺得 make 專案管理工具相當方便。

在此,我們將利用上述的範例程式 (StackType.c, StackFunc.c, StackMain.c),示範如何使用 make 工具。這些檔案在光碟中被放在範例的 ch05 資料夾中,其中包含一個名為 Makefile 的專案檔案,該檔案的內容如下:

CC = gcc
AR = ar
OBJS = StackType.o StackFunc.o
BIN = stack
RM = rm -f
INCS = -I .
LIBS = -L .
CFLAGS = $(INCS) $(LIBS)

all: $(BIN)

clean: 
    ${RM} *.o *.exe *.a

$(BIN): $(AR)
    $(CC) StackMain.c -lstack -o $(BIN) $(CFLAGS)

$(AR) : $(OBJS)
    $(AR) -r libstack.a $(OBJS)

StackFunc.o : StackFunc.c
    $(CC) -c StackFunc.c -o StackFunc.o $(CFLAGS)

StackType.o : StackType.c
    $(CC) -c StackType.c -o StackType.o $(CFLAGS)

接著,我們進行專案編譯的動作,其過程如以下範例所示。您可以看到當專案編譯指令make執行時,一連串的動作被觸發。

C:\ch05>make clean
rm -f *.o *.exe *.a

C:\ch05>make
gcc -c StackType.c -o StackType.o -I . -L .
gcc -c StackFunc.c -o StackFunc.o -I . -L .
ar -r libstack.a StackType.o StackFunc.o
ar: creating libstack.a
gcc StackMain.c -lstack -o stack -I . -L .

在make 的建置過程中,第一個目標 all會先被觸發。接著,根據all : $(BIN) 規則,其中 $(BIN) 指的是前面所定義的 BIN = stack,因此,$(BIN) 會被觸發。接著,由於 $(BIN): $(AR) 規則,於是目標 $(AR) 被觸發。根據這樣的連鎖反應規則,您可以看到如圖 5.18的觸發樹與執行過程,請讀者仔細追蹤,應可理解 make 檔案的執行原理。

=> all 
 => $(BIN)
  => $(AR) 
   => $(OBJS)
    => StackType.o
     StackType.o : gcc -c StackType.c -o StackType.o -I . -L .
    => StackFunc.o 
     StackFunc.o : gcc -c StackFunc.c -o StackFunc.o -I . -L .
   $(AR) : ar -r libstack.a StackType.o StackFunc.o
   $(AR) : ar: creating libstack.a
 $(BIN) : gcc StackMain.c -lstack -o stack -I . -L .

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License