最近在學習朱有鵬老師的嵌入式課程,講到了makefile,朱老師推薦了陳皓老師的《跟我一起學makefile》。自己對makefile一知半解,決定跟著文件,系統地學習一下,現記錄如下(對應文件的p1-p9):
第一部分 概述
makefile,管理大型工程的原始碼,定義一系列規則。
指定哪些檔案先編譯、後編譯、重新編譯。
檔案依賴性
第二部分 關於程式的編譯和鏈結
編譯(compile):把原始檔變成中間**檔案(win下是.obj;linux下是.o(object file))
需要:語法正確,函式與變數的宣告正確,告訴編譯器標頭檔案的所在位置(標頭檔案中應該只是聲
明,而定義應該放在 c/c++檔案中)。
一般來說,每個原始檔對應乙個中間目標檔案
鏈結(link):把大量的.o檔案,合成執行檔案
鏈結函式和全域性變數,使用這些中間目標檔案(o 檔案或是obj檔案)來鏈結應用程式。
不管函式所在的原始檔,只管函式的中間目標檔案 。
由於原始檔太多,編譯生成的中間目標檔案太多,在鏈結時需要明顯地指出中間目標檔名,這對於編譯很不方便。
所以,給中間目標檔案打個包,在 windows 下叫「庫檔案」(library file),也就是 .lib 檔案,
在 unix下,是 archive file,也就是 .a 檔案。
第三部分 makefile介紹
一、makefile的規則
target ... : preprequisites ...
command
......
說明:target:目標檔案,object file、執行檔案、標籤
preprequisites:生成target依賴的檔案或目標
command:任意shell命令
檔案的依賴關係,prerequisites中的檔案比target新,就執行command
二、乙個示例
8個c檔案、3個頭檔案
edit:main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
gcc -o edit main.o kbd.o command.o display.o \
insert.o files.o utils.o
main.o:main.c defs.h
gcc -c main.c
kbd.o:kbd.c defs.h command.h
gcc -c kbd.c
command.o:command.c defs.h command.h
gcc -c command.c
display.o:display.c defs.h buffer.h
gcc -c display.c
insert.o:insert.c defs.h buffer.h
gcc -c insert.c
search.o:search.c defs.h buffer.h
gcc -c search.c
files.o:files.c defs.h buffer.h command.h
gcc -c files.c
utils.o:utils.c defs.h
gcc -c utils.c
clean:
rm edit main.o kbd.o command.o display \
insert.o search.o files.o utils.o
說明:\ 表示換行
makefile裡寫程式的打包、備份等
三、make是如何工作的
1、在當前目錄下找名字叫「makefile」或「makefile」的檔案。
2、找檔案中的第乙個目標檔案(target) ,在上面的例子中是「edit」,並把這個檔案作為最終的目標檔案。
3、如果edit檔案不存在, 或是edit所依賴的後面的 .o 檔案的檔案修改時間要比edit
這個檔案新,那麼,執行後面所定義的命令生成 edit 。
4、如果 edit所依賴的.o檔案也存在,那麼 make 會在當前檔案中找目標為.o 檔案的依
賴性,如果找到則再根據那乙個規則生成.o 檔案。 (這有點像乙個堆疊的過程)
5、make 會生成 .o 檔案, 然後再用 .o 檔案生命 make的終極任務,也就是執行檔案 edit了。
《跟我一起學makefile》學習筆記(二)
學習記錄 對應文件的p10 p20 四 使用變數 edit的規則 edit main.o kbd.o display.o insert.o search.o files.o utils.o cc o edit main.o kbd.o command.o display.o insert.o sea...
讀《跟我一起學Makefile》有感
其實在之前的工作中有很多的機會接觸到makefile,但是總是沒能拿出時間通讀其語法,我想這與自身不夠積極的態度是直接掛鉤的。先說說在這次的收穫 首先從最基本的語法規則到變數定義,熟悉了其最基本的工作流程 再者結合文中的示例,自己再實際練習,熟悉了其中個別函式及特殊規則的應用。在接觸到專案中的mak...
學習《跟我一起學makefile》使用條件判斷
文章 使用條件判斷,可以讓make根據執行時的不同情況選擇不同的執行分支。條件表示式可以是比較變數的值,或是比較變數和常量的值。下面的例子,判斷 cc 變數是否gcc,如果是的話,則使用gnu函式編譯目標。libs for gcc lgnu normal libs foo objects ifeq ...