Makefile_03:Makefile介绍(作用、例子、原理)
一、Makefile 作用
Make 命令執(zhí)行時(shí),需要一個(gè) Makefile 文件,以告訴 make 命令需要怎么樣的去編譯和鏈接程序。make 命令會(huì)自動(dòng)智能地根據(jù)當(dāng)前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標(biāo)程序。我們的規(guī)則是:
1)如果這個(gè)工程沒有編譯過,那么我們的所有 C 文件都要編譯并被鏈接。
2)如果這個(gè)工程的某幾個(gè) C 文件被修改,那么我們只編譯被修改的 C 文件,并鏈接目標(biāo)程。
3)如果這個(gè)工程的頭文件被改變了,那么我們需要編譯引用了這幾個(gè)頭文件的 C 文件,并鏈接目標(biāo)程序。
Makefile的核心和主線規(guī)范如下 ------------------------------------------------ target ... : prerequisites ...command ...或者targets : prerequisites ; commandcommand ... ------------------------------------------------ PS:target 目標(biāo)文件依賴于prerequisites 中的文件,其生成規(guī)則定義在 command 中. (1)target 是一個(gè)目標(biāo)文件,可以是 中間代碼文件、執(zhí)行文件,還可以是一個(gè)標(biāo)簽(Label)。 (2)prerequisites 就是要生成那個(gè) target 所需要的文件。 (3)command 也就是 make 需要執(zhí)行的命令,任意的 Shell 命令。 (4)如果mommand命令,于prerequisites不在一行,那command必須要以[Tab]鍵開始, 如果和 prerequisites 在一行,那么可以用分號(hào)做為分隔。二、例子
比如我們的工程有 8 個(gè) C 文件和 3 個(gè)頭文件,我們要寫一個(gè) Makefile 來告訴 Make 命令如何編譯和鏈接這幾個(gè)文件。
edit : main.o kbd.o command.o display.o \insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.c kbd.o : kbd.c defs.h command.hcc -c kbd.c command.o : command.c defs.h command.hcc -c command.c display.o : display.c defs.h buffer.hcc -c display.c insert.o : insert.c defs.h buffer.hcc -c insert.c search.o : search.c defs.h buffer.hcc -c search.c files.o : files.c defs.h buffer.h command.hcc -c files.c utils.o : utils.c defs.hcc -c utils.c clean :rm edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.o(1)反斜杠(\)是換行符的意思。
(2)我們把這個(gè)內(nèi)容保存在文件為“Makefile”或“makefile”的文件中,然后在該目錄下直接輸入命令“make” 就可以生成執(zhí)行文件 edit。
(3)在定義好依賴關(guān)系后,后續(xù)的那一行定義了如何生成目標(biāo)文件的操作系統(tǒng)命令,一定要 以一個(gè) Tab 鍵作為開頭。記住,make 并不管命令是怎么工作的,他只管執(zhí)行所定義的命令。 make 會(huì)比較 targets 文件和 prerequisites 文件的修改日期,如果 prerequisites 文件的 日期要比 targets 文件的日期要新,或者 target 不存在的話,那么,make 就會(huì)執(zhí)行后續(xù)定義的命令。
(4)如果要?jiǎng)h除執(zhí)行文件和所有的中間目標(biāo)文件,那么,只要簡(jiǎn)單 地執(zhí)行一下“make clean”就可以了。clean 不是一個(gè)文件,它只不過是一個(gè)動(dòng)作名字,我們可以在一個(gè) makefile 中定義不用的編譯或是和 編譯無關(guān)的命令,比如程序的打包,程序的備份,等等。
(5)gcc參數(shù)含義
-g 可執(zhí)行程序包含調(diào)試信息
-o 指定輸出文件名
-c 只編譯不鏈接
三、Make如何工作
1、make 會(huì)在當(dāng)前目錄下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它會(huì)找文件中的第一個(gè)目標(biāo)文件(target),在上面的例子中,他會(huì)找到 “edit”這個(gè)文件,并把這個(gè)文件作為最終的目標(biāo)文件。
3、如果 edit 文件不存在,或是 edit 所依賴的后面的 .o 文件的文件修改時(shí)間要比 edit 這個(gè)文件新,那么,他就會(huì)執(zhí)行后面所定義的命令來生成 edit 這個(gè)文件。
4、如果 edit 所依賴的.o 文件也存在,那么 make 會(huì)在當(dāng)前文件中找目標(biāo)為.o 文件的依 賴性,如果找到則再根據(jù)那一個(gè)規(guī)則生成.o 文件。(這有點(diǎn)像一個(gè)堆棧的過程)
5、當(dāng)然,你的 C 文件和 H 文件是存在的啦,于是 make 會(huì)生成 .o 文件,然后再用 .o 文 件生命 make 的終極任務(wù),也就是執(zhí)行文件 edit 了。
四、Makefile 里有什么?
Makefile 里主要包含了五個(gè)東西:顯式規(guī)則、隱晦規(guī)則、變量定義、文件指示和注釋。
1、顯式規(guī)則
顯式規(guī)則說明了,如何生成一個(gè)或多的的目標(biāo)文件。這是由 Makefile 的書寫者明顯指 出,要生成的文件,文件的依賴文件,生成的命令。
2、隱晦規(guī)則
由于我們的 make 有自動(dòng)推導(dǎo)的功能,所以隱晦的規(guī)則可以讓我們比較粗糙地簡(jiǎn)略地書 寫 Makefile,這是由 make 所支持的。
3、變量的定義
在 Makefile 中我們要定義一系列的變量,變量一般都是字符串,這個(gè)有點(diǎn)你 C 語言中 的宏,當(dāng) Makefile 被執(zhí)行時(shí),其中的變量都會(huì)被擴(kuò)展到相應(yīng)的引用位置上。
4、文件指示
(1)在一個(gè) Makefile 中引用另一個(gè) Makefile,就像 C 語言中的 include 一樣;
(2)根據(jù)某些情況指定 Makefile 中的有效部分,就像 C 語言中的預(yù) 編譯#if 一樣;
(3)定義一個(gè)多行的命令。(后續(xù)講)
5、注釋
Makefile 中只有行注釋,和 UNIX 的 Shell 腳本一樣,其注釋是用“#”字符,這個(gè)就像 C/C++中的“//”一樣。如果你要在你的 Makefile 中使用“#”字符,可以用反斜框進(jìn)行轉(zhuǎn)義,如:“\#”。
五、Makefile文件名
建議命名成“Makefile”,首字母大寫。
當(dāng) 然 , 你 可 以 使 用 別 的 文 件 名 來 書 寫 Makefile , 比 如 : “Make.Linux” , “Make.Solaris”,“Make.AIX”等,如果要指定特定的 Makefile,你可以使用 make 的 “-f”和“--file”參數(shù),如:make -f Make.Linux 或 make --file Make.AIX。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Makefile_03:Makefile介绍(作用、例子、原理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Makefile_02:程序的编译和链接
- 下一篇: Makefile_04:Makefile