1. 程式人生 > >跟我一起寫 Makefile - 1. 概述

跟我一起寫 Makefile - 1. 概述

跟我一起寫 Makefile - 1. 概述

http://wiki.ubuntu.org.cn

1. 概述

什麼是 Makefile?Windows 的整合開發環境 (integrated development environment, IDE) 完成了 Makefile 的工作。在 Unix 環境下編譯軟體,需要學會編寫 Makefile。

Makefile 確定了整個工程的編譯規則。一個工程中的原始檔不計其數,並且按型別、功能、模組分別放在若干個目錄中,Makefile 定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作。Makefile 就像 shell 指令碼一樣,也可以執行作業系統的命令。

Makefile 帶來的好處是自動化編譯。一旦寫好,只需要一個 make 命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。make 是一個命令工具,是一個解釋 Makefile 中指令的命令工具。一般來說,大多數的 IDE 都有這個命令,例如 Visual Studio 的 NMAKE,Linux 的 make。

不同廠商的 make 各不相同,也有不同的語法,但其本質都是在檔案依賴性上做文章。這裡僅對 GNU make 進行講述。預設的編譯器是 Unix 下的 GCC 和 CC。

1.1 關於程式的編譯和連結

C / C++,首先要把原始檔編譯成中間程式碼檔案,在 Windows 下也就是 .obj 檔案,Unix 下是 .o 檔案,即 Object File,這個動作叫做編譯 (compile)。然後再把大量的 Object File 合成執行檔案,這個動作叫作連結 (link)。

編譯時,編譯器需要的是語法的正確,函式與變數的宣告的正確。對於後者,通常是你需要告訴編譯器標頭檔案的所在位置 (標頭檔案中應該只是宣告,而定義應該放在 C/C++ 檔案中)。只要所有的語法正確,編譯器就可以編譯出中間目標檔案。一般來說,每個原始檔都應該對應於一箇中間目標檔案 (.o 檔案或是 .obj 檔案)。

連結時,主要是連結函式和全域性變數。所以,我們可以使用這些中間目標檔案 (.o 檔案或是 .obj 檔案) 來連結我們的應用程式。連結器並不管函式所在的原始檔,只管函式的中間目標檔案 (Object File),在大多數時候,由於原始檔太多,編譯生成的中間目標檔案太多,而在連結時需要明顯地指出中間目標檔名,這對於編譯很不方便。所以,我們要給中間目標檔案打個包,在 Windows 下這種包叫庫檔案 (Library File),也就是 .lib 檔案,在 Unix 下,是 Archive File,也就是 .a 檔案。

原始檔首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。在編譯時,編譯器只檢測程式語法,以及函式和變數是否被宣告。如果函式未被宣告,編譯器會給出一個警告,但可以生成 Object File。而在連結程式時,連結器會在所有的 Object File 中找尋函式的實現。如果找不到,那到就會報連結錯誤碼 (Linker Error),在 MSVC 下,這種錯誤一般是:Link 2001 錯誤,意思是連結器未能找到函式的實現,需要指定函式的 Object File.

Wordbook

GNU Compiler Collection,GCC:GNU 編譯器套件
GNU C Compiler,GCC:GNU C 編譯器
Microsoft Visual C++,MSVC
Unix / UNIX /ˈjuːnɪks/