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