用makefile 編譯C++程序的時(shí)候,,我寫makefile時(shí)有這樣的感受,。編寫過程中我的一個(gè).o依賴于一個(gè).cpp文件,.cpp文件所對應(yīng)的.h文件中引用了其他手工編寫的.h文件.這時(shí)按照makefile的編寫規(guī)則,我們是需要依賴于這樣的.h文件,。理由是:我們每一個(gè).cpp文件是一個(gè)編譯單元,,對于這樣一個(gè)編譯單元,我們依賴于一些聲明,。記住我們都只是依賴于一些聲明,,當(dāng)這些聲明發(fā)生變化時(shí),我們必須認(rèn)為他依賴的文件已經(jīng)發(fā)生了改變,。我們有必要對其進(jìn)行重新編譯,。其實(shí)際上我們可以這樣認(rèn)為,只有.cpp才能編譯,,.h最后都載入到了cpp中,。也就是說.h的文件和.cpp的文件最終都參與了編譯,最終的.h文件都是一些變量的定義和聲明,。我們的編譯器首先把.h文件中的全部讀入到.cpp中,然后進(jìn)行編譯,,這時(shí)是按照編譯單元來編譯的,,就是保證每一個(gè)單元都能正常編譯通過。我們編譯的時(shí)候要建立一個(gè)庫用來記錄每一個(gè)所有變量的定義,,到時(shí)候要進(jìn)行鏈接,。我們先從main文件開始慢慢進(jìn)行鏈接只要是函數(shù)地址我們就用函數(shù)編譯后的相對地址,如果是變量,,我們當(dāng)然要換成變量地址,。這樣如果我們有函數(shù)或是變量的地址無法確定(可能是沒有寫函數(shù)的實(shí)現(xiàn),或是有兩種函數(shù)的實(shí)現(xiàn),,我們無法確定選那個(gè)來鏈接)就會(huì)出現(xiàn)鏈接錯(cuò)誤,。就像我們在一個(gè)頭文件中定義了一個(gè)const類型的整形常量a和一個(gè)int i類型的整形量。如果我們在幾個(gè).cpp文件中載入了此.h文件,。經(jīng)過預(yù)處理后我們進(jìn)行編譯時(shí),,在一個(gè)cpp文件中我們遇到一個(gè)變量i我們會(huì)把他登記入庫,并給他地址,。我們編譯另一個(gè).cpp之后我們的變量表中可能就會(huì)有兩個(gè)對同一個(gè)變量i的兩個(gè)記錄,。到了鏈接階段我們就會(huì)發(fā)現(xiàn)我們無法確定鏈接的地址了。這時(shí)就是一個(gè)鏈接錯(cuò)誤了,,呵呵,。 |
|