1.1在這之前,我們需要了解程式的編譯過程
a.預處理:檢查語法錯誤,展開巨集,包含標頭檔案等
b.編譯:*.c-->*.s
c.彙編:*.s-->*.o
1.2體驗在vc下程式的編譯
a.先編譯,在鏈結
b.修改了哪個檔案,就單獨編譯此檔案,在鏈結
c.修改了哪個標頭檔案,就單獨編譯使用該標頭檔案的原始檔,在鏈結
1.3在linux下實現上述要求
2.編寫乙個測試的makefile
2.1直接編譯鏈結
1 gcc -o test a.c b.c
2.2編寫乙個通用的makefile
核心:規則
目標:依賴1 依賴2...
命令命令的執行條件:
a.依賴檔案比目標檔案新
b.沒有目標檔案
2.2.1乙個簡單的makefile檔案
test:a.c b.c a.h2.2.2針對上述,改為如下gcc -o test a.c b.c
test:a.o b.o缺點:a.如果test依賴於多個檔案,將寫許多**。gcc -o test a.o b.o
a.o : a.c
gcc -c -o a.o a.c
b.o : b.c
gcc -c -o b.o b.c
b.修改a.h程式沒有反應。
2.2.3
針對上述a,可將其改為萬用字元;針對b,可增加「a.o:a.c a.h」這段**。
$@:表示目標;$^:表示全部依賴;$<:>
test:a.o b.ogcc -o test a.o b.o
a.o:a.c a.h
%.o : %.c
gcc -c -o $@ $<
缺點:如果乙個檔案的標頭檔案非常多,不可能乙個乙個列出來,應該生成乙個依賴檔案。
2.2.4生成依賴檔案
wildcard:檢查檔案是否存在
-wp,-md:生成依賴檔案
objs :=a.o b.o3.參照核心的makefile和上述的test_makefile,編寫乙個通用的makefiletest:$(objs)
gcc -o test $^# .a.o.d .b.o.d
dep_files := $(foreach
f,$(objs),.$(f).d)//對於objs裡的每個檔案,生成對應的依賴檔案。eg:a.o-->.a.o.d
dep_files :=$(wildcard $(dep_files))
ifneq ($(dep_files),)
include $(dep_files)
endif
%.o : %.c
gcc -wp,-md,.$@.d -c -o $@ $
rm *.o test
3.1子目錄下的makefile
它最簡單,形式如下:
obj-y += file.o
obj-y += subdir/
"obj-y += file.o"表示把當前目錄下的file.c編程序式裡,
"obj-y += subdir/"表示要進入subdir這個子目錄下去尋找檔案來編程序式裡,是哪些檔案由subdir目錄下的makefile決定。
注意: "subdir/"中的斜槓"/"不可省略
cross_compile = arm-linux- //交叉編譯工具鏈as = $(cross_compile)as3.3頂層目錄的makefile.build:ld =$(cross_compile)ld
cc =$(cross_compile)gcc
cpp = $(cc) -e
ar =$(cross_compile)ar
nm =$(cross_compile)nm
strip =$(cross_compile)strip
objcopy =$(cross_compile)objcopy
objdump =$(cross_compile)objdump
export as ld cc cpp ar nm //匯出變數
export strip objcopy objdump
cflags := -wall -o2 -g //編譯選項
cflags += -i $(shell pwd)/include
ldflags := -lm -lfreetype //鏈結選項
export cflags ldflags
topdir :=$(shell pwd)
export topdir
target :=show_file
obj-y +=main.o
obj-y += display/obj-y += draw/obj-y += encoding/obj-y += fonts/all :
make -c ./ -f $(topdir)/makefile.build //開啟檔案,按照頂層目錄下的makefile.build來編譯
$(cc) $(ldflags) -o $(target) built-in
.o //link
clean:
rm -f $(shell find -name "
*.o"
) rm -f $(target)
distclean:
rm -f $(shell find -name "
*.o"
) rm -f $(shell find -name "
*.d"
) rm -f $(target)
這是最複雜的部分,它的功能就是把某個目錄及它的所有子目錄中、需要編程序式去的檔案都編譯出來,打包為built-in.o。
乙個通用Makefile的編寫
我們在linux環境下開發程式,少不了要自己編寫makefile,乙個稍微大一些的工程下面都會包含很多.c的原始檔。如果我們用gcc去乙個乙個編譯每乙個原始檔的話,效率會低很多,但是如果我們可以寫乙個makefile,那麼只需要執行乙個make就ok了,這樣大大提高了開發效率。但是makefile的...
編寫乙個簡單通用的makefile
author 李超 date 2012 05 06 縱然makefile 的規則還是相當多的,編寫乙個大規模的軟體,良好的 makefile 架構是方便維護程式編譯的關鍵。學習 makefile 的時間週期還是比較長的,為了寫出規範的 需要在很短的時間內編寫乙個 makefile 這裡給給出乙個 m...
編寫乙個makefile
什麼是makefile?對於大多數的windows程式設計師來講,makefile可能不是那麼重要,因為windows的ide都為程式設計師做好了這個工作。但是在linux下程式設計,會不會寫makefile,從側面上說明乙個人是否具備完成大型工程的能力。makefile的作用 makefile是用...