梅冠華-2019-04-26
翻譯自C++學習網站 learncpp(www.learncpp.com) 第0章 第5節
https://www.learncpp.com/cpp-tutorial/introduction-to-the-compiler-linker-and-libraries/
0.5 編譯器、連結器和庫簡介
讓咱們繼續來讨論上節課的流程圖中的第4到第7步
第4步: 編譯你的源代碼
為了編譯C++程式,咱們要使用C++的編譯器。C++編譯器順序地查閱你程式中的每個源代碼(.cpp)檔案并且做兩個重要工作:
第一,它檢查你的代碼以確定其遵守了C++語言的規則。如果其沒遵守,那麼編譯器将給你抛出一個錯誤(error)(以及對應的行号)以便準确定位出什麼需要修正,編譯過程将同時終止直到該錯誤被糾正無誤。
第二,它将C++源碼翻譯成機器語言,并命名為目标(object)檔案。目标檔案通常命名成name.o或name.obj,其中name是和該目标檔案的來源.cpp檔案一樣的名字。
比如,如果你的程式有3個.cpp檔案,那麼編譯器将會生成3個目标檔案:
許多不同的作業系統都可獲得C++編譯器,咱們後面将會講講如何安裝一個編譯器,是以這裡就不需要這麼做了。
第5步:連結目标檔案和庫
在編譯器建立一個或多個目标檔案後,另一個稱之為連結器的程式就來了。連結器所做的工作有三個:
首先:把編譯器生成的所有目标檔案聯合成一個單獨的可執行程式。
其次,除了能連結目标檔案,連結器還能連結庫檔案。庫檔案是預先編譯好的代碼的集合,其已經“打包”好了,可以很友善地用在其它程式中。
實質上C++核心語言非常小和精簡(你将會在該教程中學到它)。然而,C++同時自帶了一個擴充庫,名為C++标準庫(C++ Standard Library,通常簡寫為标準庫),其提供了很多附加功能給使用者在其程式中使用。C++标準庫當中大家最常用的一個庫便是iostream庫(input output stream輸入輸出流)了,其包含了往螢幕上輸出文字和從鍵盤擷取使用者輸入的功能。幾乎每個C++程式都會用到标準庫,是以在你的程式中将标準庫連結進來是非常普遍的。許多的連結器會自動地連結到标準庫上,隻要你使用了其某一部分,是以這個你通常無需擔心。
你也可以有選擇地連結其他庫。例如,如果你要寫一個播放聲音的程式,你或許不希望自己寫代碼來從磁盤中讀取聲音檔案,檢查檔案以保證其是否正确,或是琢磨如何把聲音資料折騰到作業系統或是硬體上來通過喇叭播放它們——這将會是大量繁重的工作!相反,你可能會下載下傳某個已經知道如何做這些事情的庫,并讓它來做這些事情。咱們将會在附錄談到如何連接配接庫(并建立自己的庫!)。
再次,連結器確定所有交叉檔案依賴性都得到了妥善解決。例如,若你在一個.cpp檔案中定義了某些事,然而在另一個.cpp檔案中使用它,那麼連結器将會把他倆連接配接起來。如果連結器無法把某些事根據其定義連接配接到相應的參考上去,你将會得到一個連結錯誤(linker error),并且連結器将終止。
一旦連結器完成了所有目标檔案和庫的連結(假設一切順利),你将會得到一個可以拿來運作的可執行檔案了!
針對高階讀者
對于複雜的工程,一些開發環境使用makefile,其是一個檔案,描述如何建立(build)程式(如,哪些檔案去編譯和連結,或者用不同的方式來處理的流程)。要說清楚如何書寫和維護makefiles需要整本書的章節,但是makefile确實是無比強大的工具。然而,因為makefiles不屬于C++核心語言,而且你并不是非用它們不可,是以咱們就不在該教程中讨論它們了。
第6&7步:測試和糾錯
這是非常有趣的部分(但願如此)!你能跑下你的可執行程式,并且看看是否它生成了你所期待的結果。
如果你的程式運作了,但是并沒有正确工作,那麼就到了糾錯時間了,你得琢磨出是什麼錯誤來。很快,咱們将會深入地探讨如何測試你的程式并且如何對它們開展糾錯。
內建開發環境/Integrated development enviroments (IDEs)
注意步驟3、4、5和7都與軟體相關(編輯、編譯、連結、糾錯)。當然你可以使用分開的程式來單獨做這些事情,也可以使用一個叫做內建開發環境(IDE)的軟體包來一起做這些事情。我們将在下一節探讨IDEs,并且安裝一個IDE。
梅冠華-2019-04-26
翻譯自C++學習網站 learncpp(www.learncpp.com) 第0章 第5節
https://www.learncpp.com/cpp-tutorial/introduction-to-the-compiler-linker-and-libraries/