5 回答
TA貢獻883條經驗 獲得超454個贊
在 C/C++ 中,程序代碼要經過“編譯”和“鏈接”后才能形成可執行程序。?
編譯:
一個源代碼文件經過編譯器編譯后會生成帶有可執行代碼的文件(也就是編譯器把你寫的程序代碼翻譯為可運行的機器碼),我這里說的源代碼文件就是指 .cpp .c 之類的。這樣被分別獨立編譯的代碼一般被叫做一個“編譯單元”。
你知道一個程序很可能有多個源代碼文件,所以顯然只這一個源代碼文件生成的可執行代碼是無法構成可完整運行的程序的。
鏈接:
當然了,每一個源代碼文件都會經過編譯器的編譯,都生成了相應的可執行代碼片段。有人稱之為“中間文件”“過程文件”等,其文件名后綴在不同編譯器下也不一樣,微軟的編譯器生成的是 .obj,gcc 生成的是 .o。
前面說過一個編譯單元生成的 .o 文件無法完整運行當然是因為?其中可能引用了其他編譯單元中的變量?或者?調用了其他編譯單元中的函數。所以為了能生成最終的可執行程序,就需要把這些編譯單元的 .o 文件進行“鏈接”。
這是由鏈接器來處理的,它會找到不同編譯單元中互相引用或互相調用的代碼,處理好它們,并最終生成可執行程序。
以上就是你寫的代碼經過“編譯”和“鏈接”生成可執行程序的過程。
所以你遇到的錯誤其實不是編譯錯誤,而是鏈接錯誤。
你的 IDE 試圖把?類外定義2.cpp 編譯后就生成可執行程序,于是鏈接器就報了“找不到 getName 函數”等錯誤——因為這些函數是定義在另一個編譯單元(Teacher.cpp)中的嘛。 同理,你在單獨編譯?Teacher.cpp 后鏈接器報的錯是找不到 main 函數。
其實你需要把這兩個編譯單元(類外定義2.cpp 和 Teacher.cpp)的編譯結果都交給鏈接器,而具體如何“交給”是你的 IDE 的事。
?就像我在前面回答中所說,一般 IDE 都會以“工程”為單位來組織代碼。你要把所有源碼都放到“工程”中,這樣 IDE 在鏈接時才知道到底有哪些代碼要參與鏈接。
我猜你是沒設置好這個“工程”。
TA貢獻3593條經驗 獲得超1個贊
TA貢獻11條經驗 獲得超8個贊
因為teacher.h中其實是沒有包含teacher.cpp里的內容的,所以在最后main函數里會提示沒有定義函數,需要把teacher.cpp里的函數拷貝到teacher.h里,之后再補全main里面用到的引用函數就可以運行
- 5 回答
- 1 關注
- 3229 瀏覽
添加回答
舉報
