《跟我一起學makefile》學習筆記(一)

2021-09-14 04:59:12 字數 2184 閱讀 7017

最近在學習朱有鵬老師的嵌入式課程,講到了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 ...