|
通常我們在命令行使用GCC對程序進行編譯,如果對于單個或者幾個文件時比較方便的,但當工程中的文件逐漸增多甚至變得十分龐大的時候,使用GCC顯然力不從心,不好管理。因此我們有必要編寫一個Makefile來對工程進行管理。就以下工程目錄進行學習。
生成可執(zhí)行程序cacu,建立如下規(guī)則的Makefile文件。 #生成test,":"左邊為目標,右邊為依賴 。gcc后是命令 cacu:add_int.o add_float.o sub_int.o sub_float.o main.o gcc -o cacu add/add_int.o add/add_float.o \ (連接符) sub_int.o sub_float.o main.o #生成add_int.o的規(guī)則 add_int.o:add/add_int.c add/add_int.h gcc -c -o add/add_int.o add/add_int.c #生成add_float.o的規(guī)則 add_float.o:add/add_float.c add/add_float.h gcc -c -o add/add_float.o add/add_float.c #生成sub_int.o的規(guī)則 sub_int.o:sub/sub_int.c sub/sub_int.h gcc -c -o sub/sub_int.o sub/sub_int.c #生成sub_float.o的規(guī)則 sub_float.o:sub/sub_float.c sub/sub_float.h gcc -c -o sub/sub_float.o sub/sub_float.c #生成main.o的規(guī)則 main.o:main.c add/add.h sub/sub.h gcc -c-o main.o main.c -Iadd -Isub #清理的規(guī)則 clean: rm -f test add_int.o add_float.o sub_int.o sub_float.o main.o Makefile的規(guī)則: main. o main. c add/add. h sub/sub. h 4.規(guī)則的嵌套 在Makefile中使用用戶自定義變量 定義OBJS變量表示目標文件: OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 在調(diào)用OBJS的時候在前面加上$,并且變量的名稱可以用括號括起來。例如,使用gcc的默認規(guī)則進行編譯,cacu的規(guī)則可以采用如下形式 cuca:gcc -o cacu $(OBJS) 用CC表示gcc,用CFLAGS表示編譯選項,RM表示rm -f ,TARGET表示最終的生成目標cacu。 CC = gcc (CC定義成為gcc) 這樣,之前冗長的Makefile可以簡化為如下形式。
1 CC = gcc 2 CFLAGS = -Isub -Iadd -O2 (O2為優(yōu)化) 3 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 4 TARGET = cacu 5 RM = rm -f 6 $(TARGET):$(OBJS) 7 $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) 8 $(OBJS):%.o:%.c (將OBJS中所有擴展名為.o的文件替換成擴展名為.c的文件) 9 $(CC) -c $(CFLAGS) $< -o $@ (生成目標文件) 10 clean: 11 -$(RM) $(TARGET) $(OBJS) - 表示忽略錯誤 由于CC的默認值已經(jīng)為cc,RM的默認值為 rm -f,因此,如果在調(diào)用這些變量的時候未顯式給出變量的定義,編譯器就去調(diào)用其默認值。經(jīng)過簡化,可以得到以下形式: 1 CFLAGS = -Isub -Iadd -O2 (O2為優(yōu)化) 2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 3 TARGET = cacu 4 $(TARGET):$(OBJS) 5 $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) 6 $(OBJS):%.o:%.c (將OBJS中所有擴展名為.o的文件替換成擴展名為.c的文件) 7 $(CC) -c $(CFLAGS) $< -o $@ (生成目標文件) 8 clean: 9 -$(RM) $(TARGET) $(OBJS) - 表示忽略錯誤 Makefile很智能(會自動推導,使用默認的方式生成目標文件),可以再簡化,就可以得到如下形式: 1 CFLAGS = -Isub -Iadd -O2 (O2為優(yōu)化) 2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o 3 TARGET = cacu 4 $(TARGET):$(OBJS) 5 $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) 6 clean: 7 -$(RM) $(TARGET) $(OBJS) - 表示忽略錯誤 Makefile之博大精深,暫時學習到這里(待續(xù))。。。。 |
|
|