跟我一起寫Makefile 概述

2021-09-07 11:40:06 字數 2485 閱讀 4213

什麼是makefile

?也許非常多winodws

的程式猿都不知道這個東西。由於那些windows

的整合開發環境(integrateddevelopment environment,ide)

都為你做了這個工作,但我認為要作乙個好的和professional

的程式猿,makefile

還是要懂。這就好像如今有這麼多的html

的編輯器。但假設你想成為乙個專業人士,你還是要了解html

的標識的含義。

特別在unix

下的軟體編譯,你就不能不自己寫makefile

了,會不會寫makefile

,從乙個側面說明了乙個人是否具備完畢大型project的能力。

由於,makefile

關係到了整個project的編譯規則。

乙個project中的原始檔不計其數。而且按型別、功能、模組分別放在若干個資料夾中。makefile

定義了一系列的規則來指定。哪些檔案須要先編譯。哪些檔案須要後編譯,哪些檔案須要又一次編譯,甚至於進行更複雜的功能操作,由於makefile

就像乙個shell

指令碼一樣。當中也能夠執行作業系統的命令。

makefile

帶來的優點就是——「自己主動化編譯」,一旦寫好。僅僅須要乙個make

命令,整個project全然自己主動編譯,極大的提高了軟體開發的效率。make

是乙個命令工具,是乙個解釋makefile

中指令的命令工具,一般來說。大多數的ide

都有這個命令,比方:delphi

的make

,visualc++

的nmake

。linux

下gnu

的make

。可見。makefile

都成為了一種在project方面的編譯方法。

如今講述怎樣寫makefile

的文章比較少。這是我想寫這篇文章的原因。當然。不同廠商的make

各不同樣,也有不同的語法,但其本質都是在「檔案依賴性」上做文章,這裡,我僅對gnu

的make

進行講述,我的環境是redhatlinux 8.0

,make

的版本號是3.80

。畢竟,這個make

是應用最為廣泛的,也是用得最多的。並且其還是最遵循於ieee1003.2-1992

標準的(posix.2)。

在這篇文件中,將以c/c++

的源**作為我們基礎,所以必定涉及一些關於c/c++

的編譯的知識。相關於這方面的內容,還請各位檢視相關的編譯器的文件。這裡所預設的編譯器是unix

下的gcc

和cc。

關於程式的編譯和鏈結

在此,我想多說關於程式編譯的一些規範和方法。一般來說,不管是c

、c++

、還是pas

。首先要把原始檔編譯成中間**檔案,在windows

下也就是.obj

檔案。unix

下是.o

檔案。即objectfile

,這個動作叫做編譯(compile

)。然後再把大量的objectfile

合成執行檔案,這個動作叫作鏈結(link)。

編譯時,編譯器須要的是語法的正確,函式與變數的宣告的正確。對於後者,一般是你須要告訴編譯器標頭檔案的所在位置(標頭檔案裡應該僅僅是宣告,而定義應該放在c/c++

檔案裡)。僅僅要全部的語法正確,編譯器就能夠編譯出中間目標檔案。一般來說,每乙個原始檔都應該相應於乙個中間目標檔案(o

檔案或是obj

檔案)。

鏈結時。主要是鏈結函式和全域性變數,所以,我們能夠使用這些中間目標檔案(o

檔案或是obj

檔案)來鏈結我們的應用程式。鏈結器並無論函式所在的原始檔。僅僅管函式的中間目標檔案(objectfile

)。在大多數時候,因為原始檔太多,編譯生成的中間目標檔案太多。而在鏈結時須要明顯地指出中間目標檔名稱,這對於編譯非常不方便。所以,我們要給中間目標檔案打個包,在windows

下這樣的包叫「庫檔案」(libraryfile)

。也就是.lib

檔案,在unix

下。是archivefile

。也就是.a

檔案。

總結一下,原始檔首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。在編譯時。編譯器僅僅檢測程式語法。和函式、變數是否被宣告。假設函式未被宣告。編譯器會給出乙個警告,但能夠生成objectfile

。 而在鏈結程式時。鏈結器會在全部的objectfile

中找尋函式的實現,假設找不到,那到就會報鏈結錯誤碼(linkererror

)。在vc

下,這樣的錯誤通常是:link2001

錯誤,意思說是說,鏈結器未能找到函式的實現。

你須要指定函式的objectfile.

好,言歸正傳。gnu

的make

有很多的內容,閒言少敘。

from ubuntu wiki

跟我一起寫Makefile 概述

什麼是makefile 或許很多winodws 的程式設計師都不知道這個東西,因為那些windows 的整合開發環境 integrateddevelopment environment,ide 都為你做了這個工作,但我覺得要作乙個好的和professional 的程式設計師,makefile 還是要...

跟我一起寫 Makefile

概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...

跟我一起寫 Makefile

概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...