用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ò)誤了,呵呵。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。