標籤:makefile
0.前言 從學習C語言開始就慢慢開始接觸makefile,查閱了很多的makefile的資料但總感覺沒有真正掌握makefile,如果自己動手寫一個makefile總覺得非常吃力。所以特意藉助部落格總結makefile的相關知識,通過例子說明makefile的具體用法。 例說makefile大致分為4個部分 1.只有單個C檔案 2.含有多個C檔案 3.需要包括標頭檔路徑 4.一個較為複雜的例子 【代碼倉庫】——makefile-example 代碼倉庫位於bitbucket,可藉助TortoiseHg(GUI工具)複製代碼或者在網頁中直接下載zip包。
1.三個C檔案 三個檔案位於同一個目錄中。 【test.c】
#include <stdio.h>int main(void){ int a = 3; int b = 2; printf("a=%d\n", a); printf("b=%d\n", b); printf("a+b=%d\n", a+b); printf("a-b=%d\n", a-b); return 0;} 【test-add.c】
int add(int a, int b) { return a+b;} 【test-sub.c】
int sub(int a, int b) { return a-b;}
2.複習GCC指令 多個C檔案和單個C檔案的處理過程相似,此時-c或-o之後可以增加多個C檔案或目標檔案。 【編譯源檔案】 gcc -c test.c test-add.c test-sub.c 【連結目標檔案】 gcc -o test test.o test-add.o test-sub.o 【執行目標檔案】 ./test 【控制台輸出】 a=3 b=2 a+b=5 a-b=1
3.編寫makefile檔案 【makefile】 請替換其中的[tab],並以代碼倉庫中的makefile檔案為主。
# 指令編譯器和選項CC=gccCFLAGS=-Wall -std=gnu99# 目標檔案TARGET=test# 源檔案SRCS=test.c test-add.c test-sub.cOBJS = $(SRCS:.c=.o)$(TARGET):$(OBJS)#@echo TARGET:[email protected]#@echo OBJECTS:$^[tab]$(CC) -o [email protected] $^clean:[tab]rm -rf $(TARGET) $(OBJS)%.o:%.c[tab]$(CC) $(CFLAGS) -o [email protected] -c $<
【具體說明】 【1】更多說明請參考:例說makefile——單個檔案 【2】相對於單個檔案,此處僅修改了SRCS=test.c test-add.c test-sub.c,變數SRCS追加了多個C檔案。相比單個檔案的情況,僅僅修改了這一行。 【3】檔案和檔案之間通過空格隔開。 【執行過程】 make clean && make 【控制台輸出】rm -rf test test.o test-add.o test-sub.ogcc -Wall -std=gnu99 -o test.o -c test.cgcc -Wall -std=gnu99 -o test-add.o -c test-add.cgcc -Wall -std=gnu99 -o test-sub.o -c test-sub.cgcc -o test test.o test-add.o test-sub.o 從控制台的輸出可以看出,通過make clean清除上一次的可執行檔和目標檔案,然後依次編譯各個C檔案,最後把3個目標檔案連結為最終可執行檔。