Makefile詳解 程式的編譯和鏈結

2021-07-24 07:08:32 字數 821 閱讀 6813

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

程式的編譯鏈結makefile寫法

編譯器 gcc 編譯環境 linux 資料夾 inc 存放標頭檔案.h,src 存放原檔案.c,lib 存放靜態檔案.a,obj 存放目標檔案.o 在當前目錄path下,主函式為main.c 通俗來講就是先將原檔案編譯成目標檔案,再將目標檔案鏈結生成可執行程式,linux中是.out形式,如wind...

使用makefile編譯c程式

一 makefile的規則 makefile的規則如下 target prerequisites command 這裡的command是指生成或是處理target隨執行的命令 prerequisites指的是生成target所需要依賴的檔案.二 乙個示例 自行編寫了2個c檔案 get max.c,f...

Linux 用makefile編譯程式

makefile可以方便快捷的編譯我們編寫的程式,也可以處理一些檔案,例如刪除檔案,檢視檔案。初學者對makefile的掌握如下 makefile的結構 第一行 編譯完成的檔名稱 編譯檔案所需的原始檔 第二行 游標在行首的時候按一下tab鍵,一般情況下,在vim下按完tab後,之後的字母會變成紅色 ...