Makefile的相關知識

2021-08-29 04:09:44 字數 1438 閱讀 1263

什麼是 makefile?

乙個工程中的原始檔不計數,其按型別、功能、模組分別放在若干個目錄中,makefile 定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為makefile 就像乙個shell指令碼一樣,其中也可以執行作業系統的命令。makefile 帶來的好處就是——「自動化編譯」,一旦寫好,只需要乙個make 命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。

make 命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。make 是乙個命令工具,是乙個解釋makefile 中指令的命令工具,一般來說,大多數的ide 都有這個命令,比如:delphi的make,visual c++的nmake,linux 下gnu 的make。可見,makefile 都成為了一種在工程方面的編譯方法。當然,不同產商的make 各不相同,也有不同的語法,但其本質都是在「檔案依賴性」上做文章。

在這篇文件中,將以c/c++的原始碼作為我們基礎,所以必然涉及一些關於c/c++的編譯的知識,相關於這方面的內容,還請各位檢視相關 的編譯器的文件。這裡所預設的編譯器是unix 下的gcc 和cc。

關於程式的編譯和鏈結

在此,我想多說關於程式編譯的一些規範和方法,一般來說,無論是c、c++,首先要把原始檔編譯成中間**檔案,在windows下也就是.obj 檔案,linux/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),在vc下,這種錯誤一般是:link 2001 錯誤,意思說是說,鏈結器未能找到函式的實現。你需要指定函式的object file.

具體內容可參閱:跟我一起寫makefile

Makefile 入門知識

這篇文章介紹在linux下進行c語言程式設計所需要的基礎知識。在這篇文章當中,我們將會學到以下內容 源程式編譯 makefile的編寫 程式庫的鏈結 程式的除錯 標頭檔案和系統求助 1.源程式的編譯 在linux下面,如果要編譯乙個c語言源程式,我們要使用gnu的gcc編譯器。下面我們以乙個例項來說...

Makefile知識要點

clean rm o phony clean phony顯式地告訴 make clean的是偽目標,那麼每次makeclean必然會執行rm o。否則存在一種可能性,假如當前路徑下有乙個名為clean的檔案,因為clean這個目標又沒有依賴的檔案,那這個clean檔案永遠被認為是最新的,導致rm指令...

Makefile知識小記

gcc是linux中的編譯器,它是通過某種規則來進行編譯的,在這之前還有乙個linux自帶的構建器叫make,make也需要通過某種規則來構建,而這些規則就通過makefile來設定。makefile檔案的命名可以是makefile或makefile。makefile中的規則 三部分 目標 依賴 命...