《跟我一起写Makefile》读书笔记(1)
生活随笔
收集整理的這篇文章主要介紹了
《跟我一起写Makefile》读书笔记(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下內容源于陳皓所寫《跟我一起寫Makefile》的學習和整理,如有侵權,請告知刪除。
一、概述
(1)makefile的作用,類似于windows中的IDE工具的功能;
(2)makefile 關系到整個工程的編譯規則
- 定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯。
- 甚至于進行更復雜的功能操作,因為makefile 就像一個 Shell 腳本一樣,其中也可以執行操作系統的命令。
- 一旦寫好,只需要一個 make 命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
二、關于程序的編譯和連接
(1)源文件經過編譯器的編譯,生成中間目標文件(.o文件,即Object File)
- 在編譯時,編譯器只檢測程序語法,和函數、變量是否被聲明。如果函數未被聲明,編譯器會給出一個警告,但可以生成 Object File。
- 一般來說,每個源文件都應該對應于一個中間目標文件(O 文件或是 OBJ 文件)。
- 鏈接時,主要是鏈接函數和全局變量?。
- 由于源文件太多,編譯生成的中間目標文件太多,而在鏈接時需要明顯地指出中間目標文件名,這對于編譯很不方便,所以,我們要給中間目標文件打個包,在 Windows 下這種包叫“庫文件”(Library File),也就是 .lib 文件,在 UNIX下,是 Archive File,也就是 .a 文件。
(3)由.elf文件得到可以燒寫的鏡像文件
- 鏈接器所得到.elf文件是可執行程序(在操作系統下,此.el文件可以執行);
- 但在嵌入式裸機中,我們需要的是可以燒寫的文件(可燒寫的文件就叫鏡像image);
- 因此我們需要用這個.elf為原材料來制作鏡像,制作工具是交叉編譯工具鏈中的arm-linux-objcopy。
- 使用arm-linux-objdump工具進行反編譯(反匯編);
- 把編譯后的.elf格式的可執行程序反編譯,得到它的匯編源代碼。
- 我們使用反匯編主要是用來學習。
(4)Makefile文件中把編譯和鏈接的過程分開。
- 用gcc a.c -o exe這種方式來編譯時,形式上把編譯和鏈接過程一步完成了。
- 但是在內部實際上編譯和鏈接永遠是分開獨立進行的,編譯要使用編譯器gcc,鏈接要使用鏈接器ld。
三、Makefile的介紹
1、makefile的規則
target ... : prerequisites ... command(1)如果prerequisites中有一個以上的文件比 target 文件要新的話,command 所定義的命令就會被執行。這就是 Makefile 的規則。也就是 Makefile 中最核心的內容。
(2)命令前一定要以一個 Tab 鍵作為開頭。
(3)“目標:”后面如果沒有依賴
- 那么,make 就不會自動去找文件的依賴性,也就不會自動執行其后所定義的命令。
- 要執行其后的命令,就要在 make 命令后明顯得指出這個lable 的名字。
- 這樣的方法非常有用,我們可以在一個 makefile 中定義不用的編譯或是和編譯無關的命令,比如程序的打包,程序的備份,等等。
2、makefile是如何工作的?
- make 會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。
- 在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make 就會直接退出,并報錯;
- 對于所定義的命令的錯誤,或是編譯不成功,make 根本不理。
3、makefile中使用變量
這類似于shell中定義變量,然后使用$來引用
4、makefile的自動推導
.PHONY修飾clean,表示clean是一個偽目標
5、清空目標文件的規則
如上,每個Makefile中都應該寫一個清空目標文件(.o 和執行文件)的規則,這不僅便于重編譯,也很利于保持文件的清潔
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的《跟我一起写Makefile》读书笔记(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易云音乐 linux x32,网易云音
- 下一篇: 初二计算机辅导记录,信息技术指导老师的讲