(2)Linux的C編譯與makefile
一、C語言環(huán)境的編寫和編譯
????需要用到gcc編譯器,例:
????gcc main.c -o main?//指定輸出名字為main
????生成一個a.out文件,再利用‘./+可執(zhí)行文件名’執(zhí)行。
二、
通過在終端執(zhí)行 gcc 命令來完成 C 文件的編譯,如果我們的工程只有一兩個 C 文件還好,需要輸入的命令不多,當文件有幾十、上百甚至上萬個的時候用終端輸入 GCC 命令的方法顯然是不現(xiàn)實的。如果我們能夠編寫一個文件,這個文件描述了編譯哪些源碼文件、如何編譯那就好了,每次需要編譯工程的時只需要使用這個文件就行了。這種問題怎么可能難倒聰明的程序員,為此提出了一個解決大工程編譯的工具:make,描述哪些文件需要編譯、哪些需要重新編譯的文件就叫做 Makefile,Makefile 就跟腳本文件一樣,Makefile 里面還可以執(zhí)行系統(tǒng)命令。使用的時候只需要一個 make命令即可完成整個工程的自動編譯,極大的提高了軟件開發(fā)的效率。如果大家以前一直使用 IDE來編寫 C 語言的話肯定沒有聽說過 Makefile 這個東西,其實這些 IDE 是有的,只不過這些 IDE對其進行了封裝,提供給大家的是已經(jīng)經(jīng)過封裝后的圖形界面了,我們在 IDE 中添加要編譯的C 文件,然后點擊按鈕就完成了編譯。在 Linux 下用的最多的是 GCC 編譯器,這是個沒有 UI的編譯器,因此 Makefile 就需要我們自己來編寫了。作為一個專業(yè)的程序員,是一定要懂得Makefile 的,一是因為在 Linux 下你不得不懂 Makefile,再就是通過 Makefile 你就能了解整個工程的處理過程。
三、Makefile具體操作流程

Makefile 編寫好以后我們就可以使用 make 命令來編譯我們的工程了,直接在命令行中輸入“make”即可,make 命令會在當前目錄下查找是否存在“Makefile”這個文件,如果存在的話就會按照 Makefile 里面定義的編譯方式進行編譯。
Makefile講解:
首先更新第一條規(guī)則中的 main,第一條規(guī)則的目標成為默認目標,只要默認目標更新了那么就認為 Makefile 的工作。在第一次編譯的時候由于 main 還不存在,因此第一條規(guī)則會執(zhí)行,
第一條規(guī)則依賴于文件 main.o、input.o 和 calcu.o 這個三個.o 文件,這三個.o 文件目前還都沒有,因此必須先更新這三個文件。make 會查找以這三個.o 文件為目標的規(guī)則并執(zhí)行。以 main.o為例,發(fā)現(xiàn)更新 main.o 的是第二條規(guī)則,因此會執(zhí)行第二條規(guī)則,第二條規(guī)則里面的命令為“gcc–c main.c”,這行命令很熟悉了吧,就是不鏈接編譯 main.c,生成 main.o,其它兩個.o 文件同理。
最后一個規(guī)則目標是 clean,它沒有依賴文件,因此會默認為依賴文件都是最新的,所以其對應的命令不會執(zhí)行,當我們想要執(zhí)行 clean 的話可以直接使用命令“make clean”,執(zhí)行以后就會刪除當前目錄下所有的.o 文件以及 main,因此 clean 的功能就是完成工程的清理,“make clean”。
關于此處我的理解還不夠深入,尤其是對于clean這個地方,沒有依賴文件?所以不會執(zhí)行命令?
我們在來總結一下 Make 的執(zhí)行過程:
1、make 命令會在當前目錄下查找以 Makefile(makefile 其實也可以)命名的文件。
2、當找到 Makefile 文件以后就會按照 Makefile 中定義的規(guī)則去編譯生成最終的目標文件。
3、當發(fā)現(xiàn)目標文件不存在,或者目標所依賴的文件比目標文件新(也就是最后修改時間比目標文件晚)的話就會執(zhí)行后面的命令來更新目標。


本文參考正點原子,是按照個人理解來寫的,方便翻看回看記憶。