編寫乙個通用的Makefile檔案

2022-08-03 01:09:11 字數 3909 閱讀 1817

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.h

gcc -o test a.c b.c

2.2.2針對上述,改為如下

test:a.o b.o

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

缺點:a.如果test依賴於多個檔案,將寫許多**。

b.修改a.h程式沒有反應。

2.2.3

針對上述a,可將其改為萬用字元;針對b,可增加「a.o:a.c a.h」這段**。

$@:表示目標;$^:表示全部依賴;$<:>

test:a.o b.o
gcc -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.o

test:$(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,[email protected] -c -o $@ $

rm *.o test

3.參照核心的makefile和上述的test_makefile,編寫乙個通用的makefile

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)as

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)

3.3頂層目錄的makefile.build:

這是最複雜的部分,它的功能就是把某個目錄及它的所有子目錄中、需要編程序式去的檔案都編譯出來,打包為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是用...