5 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
在 C/C++ 中,程序代碼要經(jīng)過(guò)“編譯”和“鏈接”后才能形成可執(zhí)行程序。?
編譯:
一個(gè)源代碼文件經(jīng)過(guò)編譯器編譯后會(huì)生成帶有可執(zhí)行代碼的文件(也就是編譯器把你寫(xiě)的程序代碼翻譯為可運(yùn)行的機(jī)器碼),我這里說(shuō)的源代碼文件就是指 .cpp .c 之類(lèi)的。這樣被分別獨(dú)立編譯的代碼一般被叫做一個(gè)“編譯單元”。
你知道一個(gè)程序很可能有多個(gè)源代碼文件,所以顯然只這一個(gè)源代碼文件生成的可執(zhí)行代碼是無(wú)法構(gòu)成可完整運(yùn)行的程序的。
鏈接:
當(dāng)然了,每一個(gè)源代碼文件都會(huì)經(jīng)過(guò)編譯器的編譯,都生成了相應(yīng)的可執(zhí)行代碼片段。有人稱(chēng)之為“中間文件”“過(guò)程文件”等,其文件名后綴在不同編譯器下也不一樣,微軟的編譯器生成的是 .obj,gcc 生成的是 .o。
前面說(shuō)過(guò)一個(gè)編譯單元生成的 .o 文件無(wú)法完整運(yùn)行當(dāng)然是因?yàn)?其中可能引用了其他編譯單元中的變量?或者?調(diào)用了其他編譯單元中的函數(shù)。所以為了能生成最終的可執(zhí)行程序,就需要把這些編譯單元的 .o 文件進(jìn)行“鏈接”。
這是由鏈接器來(lái)處理的,它會(huì)找到不同編譯單元中互相引用或互相調(diào)用的代碼,處理好它們,并最終生成可執(zhí)行程序。
以上就是你寫(xiě)的代碼經(jīng)過(guò)“編譯”和“鏈接”生成可執(zhí)行程序的過(guò)程。
所以你遇到的錯(cuò)誤其實(shí)不是編譯錯(cuò)誤,而是鏈接錯(cuò)誤。
你的 IDE 試圖把?類(lèi)外定義2.cpp 編譯后就生成可執(zhí)行程序,于是鏈接器就報(bào)了“找不到 getName 函數(shù)”等錯(cuò)誤——因?yàn)檫@些函數(shù)是定義在另一個(gè)編譯單元(Teacher.cpp)中的嘛。 同理,你在單獨(dú)編譯?Teacher.cpp 后鏈接器報(bào)的錯(cuò)是找不到 main 函數(shù)。
其實(shí)你需要把這兩個(gè)編譯單元(類(lèi)外定義2.cpp 和 Teacher.cpp)的編譯結(jié)果都交給鏈接器,而具體如何“交給”是你的 IDE 的事。
?就像我在前面回答中所說(shuō),一般 IDE 都會(huì)以“工程”為單位來(lái)組織代碼。你要把所有源碼都放到“工程”中,這樣 IDE 在鏈接時(shí)才知道到底有哪些代碼要參與鏈接。
我猜你是沒(méi)設(shè)置好這個(gè)“工程”。

TA貢獻(xiàn)3593條經(jīng)驗(yàn) 獲得超0個(gè)贊

TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超0個(gè)贊
你可以試一下直接在頭文件里面添加那個(gè)頭文件,不用改后綴
我看過(guò)這個(gè),c++遠(yuǎn)征-封裝篇上,5,2上面又講
他是另外創(chuàng)建了一個(gè)頭文件和一個(gè)源文件

TA貢獻(xiàn)11條經(jīng)驗(yàn) 獲得超8個(gè)贊
因?yàn)閠eacher.h中其實(shí)是沒(méi)有包含teacher.cpp里的內(nèi)容的,所以在最后main函數(shù)里會(huì)提示沒(méi)有定義函數(shù),需要把teacher.cpp里的函數(shù)拷貝到teacher.h里,之后再補(bǔ)全main里面用到的引用函數(shù)就可以運(yùn)行

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
我沒(méi)有用過(guò)這個(gè) IDE,不過(guò)你確定 Teacher.cpp 也同時(shí)編譯并且鏈接了嗎?
- 5 回答
- 1 關(guān)注
- 3159 瀏覽
添加回答
舉報(bào)