- 現(xiàn)代C++編程:從入門到實(shí)踐
- (美)喬什·洛斯皮諾索
- 3586字
- 2024-04-15 11:40:39
1.2 編譯器工具鏈
為C++程序編寫代碼之后,下一步就是將代碼轉(zhuǎn)換為可執(zhí)行程序。編譯器工具鏈?zhǔn)且粋€(gè)包含三種元素的集合,它們按順序運(yùn)行,將代碼轉(zhuǎn)換為可執(zhí)行程序:
? 首先,由預(yù)處理器(preprocessor)執(zhí)行基本的源代碼轉(zhuǎn)換。例如,#include<cstdio>是一種預(yù)處理指令,它指示預(yù)處理器將cstdio程序庫引入源代碼中。當(dāng)預(yù)處理器完成源代碼的處理之后,它會(huì)生成一個(gè)編譯單元。每一個(gè)編譯單元都會(huì)被傳給編譯器去處理。
? 其次,由編譯器(compiler)讀入編譯單元,生成一個(gè)目標(biāo)文件。目標(biāo)文件包含一種叫作目標(biāo)代碼的中間格式數(shù)據(jù)。這些文件中的數(shù)據(jù)和指令都是中間格式的,它們對(duì)人類來說不可讀。編譯器一次轉(zhuǎn)換一個(gè)編譯單元,所以每一個(gè)編譯單元都對(duì)應(yīng)一個(gè)目標(biāo)文件。
? 最后,由鏈接器(linker)從目標(biāo)文件中生成最終程序。鏈接器也負(fù)責(zé)尋找包含在源代碼中的程序庫。例如,當(dāng)編譯代碼清單1-1中的程序時(shí),鏈接器會(huì)找到cstdio程序庫,并且引入所有必要的信息來使用printf函數(shù)。注意,cstdio頭文件(header)不同于cstdio程序庫。頭文件包含使用程序庫的方法的信息。第21章將介紹更多關(guān)于程序庫和源代碼組織結(jié)構(gòu)的知識(shí)。
1.2.1 設(shè)置開發(fā)環(huán)境
所有的C++開發(fā)環(huán)境都包含一套編輯源代碼的編輯器和將源代碼轉(zhuǎn)換為程序的編譯器工具鏈。通常,開發(fā)環(huán)境也包含調(diào)試器,它是一種可以讓我們一行行地執(zhí)行程序的代碼以尋找錯(cuò)誤的無價(jià)工具。
當(dāng)所有這些工具——文本編輯器、編譯器工具鏈和調(diào)試器——打包成一個(gè)程序時(shí),我們稱這個(gè)程序?yàn)榻换ナ介_發(fā)環(huán)境(Interactive Development Environment,IDE)。IDE對(duì)初學(xué)者和老手的效率提升都有巨大作用。
注意 不幸的是,C++并沒有一個(gè)可以交互地執(zhí)行C++代碼片段的解釋器,這和Python、Ruby和JavaScript等語言不同,它們都有解釋器。一些Web應(yīng)用程序允許測(cè)試和分享一些小的C++代碼片段,例如Wandbox(https://wandbox.org/)——該網(wǎng)站可以讓你編譯和運(yùn)行代碼,以及Matt Godbolt的Compiler Explorer(https://www.godbolt.org/)——該網(wǎng)站可以讓你檢查源代碼生成的匯編代碼。這兩者都可以在各種編譯器和系統(tǒng)上運(yùn)行。
每一個(gè)操作系統(tǒng)都有自己的源代碼編輯器和編譯器工具鏈,所以本節(jié)將按照操作系統(tǒng)組織。你可以直接跳到對(duì)應(yīng)的操作系統(tǒng)部分。
1.2.2 Windows 10以及后續(xù)版本:Visual Studio
編寫本書時(shí),Windows最流行的C++編譯器是微軟Visual C++編譯器(MicroSoft Visual C++ Compiler,MSVC)。獲取MSVC最簡(jiǎn)單的方法就是按照下列步驟安裝Visual Studio 2017 IDE:
1)下載Visual Studio 2017社區(qū)版(https://ccc.codes/)。
2)運(yùn)行安裝包,如果有必要,請(qǐng)?jiān)试S它進(jìn)行更新。
3)在Installing Visual Studio界面,請(qǐng)確保Desktop Development with C++ Workload被選中了。
4)單擊Install(安裝)按鈕安裝Visual Studio 2017以及MSVC。
5)單擊Launch(運(yùn)行)按鈕運(yùn)行Visual Studio 2017。整個(gè)過程可能需要花費(fèi)幾小時(shí),具體取決于機(jī)器的速度和所選的選項(xiàng)。典型的安裝空間需要20~50GB。
設(shè)置新項(xiàng)目的步驟如下:
1)選擇File(文件)→New(新建)→Project(項(xiàng)目)。
2)在Installed(已安裝)下,單擊Visual C++并且選擇Default(默認(rèn))。然后,在中間的面板中選擇Empty Project(空項(xiàng)目)。
3)輸入hello作為項(xiàng)目的名稱。這時(shí),窗口應(yīng)該看起來和圖1-1類似,但是Location可能不同,具體取決于用戶名。單擊OK(確認(rèn))。

圖1-1 Visual Studio 2017新建項(xiàng)目窗口
4)在工作空間左邊的Solution Explorer(解決方案資源管理器)中,右鍵單擊Source Files(源文件)并且選擇Add(添加)→Existing Item(現(xiàn)有項(xiàng)),如圖1-2所示。

圖1-2 向Visual Studio 2017項(xiàng)目中添加現(xiàn)有源文件
5)選擇之前在代碼清單1-1中創(chuàng)建的文件main.cpp。如果還沒有創(chuàng)建這個(gè)文件,則選擇New Item(新建)而不是Existing Item(現(xiàn)有項(xiàng)),將該文件命名為main.cpp并將代碼清單1-1的內(nèi)容輸入到相應(yīng)的編輯器窗口中。
6)選擇Build(生成)→Build Solution(生成解決方案)。如果輸出窗口出現(xiàn)任何錯(cuò)誤,請(qǐng)確認(rèn)輸入的內(nèi)容和代碼清單1-1中的一致。如果仍然出現(xiàn)錯(cuò)誤,請(qǐng)仔細(xì)檢查這些錯(cuò)誤內(nèi)容來獲取提示。
7)選擇Debug(調(diào)試)→Start Without Debugging(開始執(zhí)行,不調(diào)試)或者按下<Ctrl+F5>鍵來運(yùn)行程序。此時(shí),Hello, world!字樣將被打印在控制臺(tái)窗口中(緊接著,會(huì)有按任意鍵繼續(xù)的字樣)。
1.2.3 macOS:Xcode
如果使用的是macOS,那么應(yīng)該安裝Xcode開發(fā)環(huán)境:
1)打開App Store(應(yīng)用商店)。
2)搜索并安裝Xcode開發(fā)環(huán)境。安裝過程可能會(huì)花費(fèi)一個(gè)多小時(shí),具體取決于機(jī)器和互聯(lián)網(wǎng)連接的速度。當(dāng)安裝完成時(shí),打開Terminal(終端)并轉(zhuǎn)到保存main.cpp的目錄。
3)在終端中輸入clang++main.cpp-o hello來編譯程序。-o選項(xiàng)指示工具鏈將結(jié)果輸出到哪里。如果出現(xiàn)了編譯錯(cuò)誤,請(qǐng)檢查之前輸入的程序內(nèi)容是否正確。
4)在終端中輸入./hello來運(yùn)行程序。此時(shí),Hello, world!字樣會(huì)出現(xiàn)在屏幕上。
為了編譯和運(yùn)行程序,請(qǐng)打開Xcode開發(fā)環(huán)境并且按以下步驟執(zhí)行:
1)選擇File(文件)→New(新建)→Project(項(xiàng)目)。
2)選擇macOS→Command Line Tool(命令行工具)并單擊Next(下一步)。在下一個(gè)對(duì)話框中,可以選擇在哪里創(chuàng)建項(xiàng)目的文件。現(xiàn)在,接受默認(rèn)設(shè)置并且單擊Create(創(chuàng)建)。
3)將項(xiàng)目命名為hello并將其類型設(shè)置為C++,參見圖1-3。

圖1-3 Xcode中新建項(xiàng)目對(duì)話框
4)現(xiàn)在,將代碼清單1-1中的代碼導(dǎo)入項(xiàng)目中。一個(gè)簡(jiǎn)單的辦法就是將main.cpp的內(nèi)容復(fù)制、粘貼到項(xiàng)目的main.cpp。另一個(gè)辦法就是使用Finder進(jìn)行替換。(在創(chuàng)建新項(xiàng)目時(shí)通常不需要處理這個(gè)問題。這只是本教程為了應(yīng)付多個(gè)操作系統(tǒng)環(huán)境的特殊步驟。)
5)單擊Run(運(yùn)行)。
1.2.4 Linux和GCC
對(duì)于Linux,可以選擇兩種C++編譯器:GCC和Clang。在編寫本書時(shí),最新的GCC穩(wěn)定版是9.1,最新的Clang版本是8.0.0。這一節(jié)將介紹如何安裝它們。有時(shí)候,用戶會(huì)覺得其中一個(gè)的錯(cuò)誤信息比另一個(gè)的更有幫助。
注意 GCC表示GNU編譯器套件(GNU Compiler Collection)。GNU的發(fā)音是“guh-NEW”,意指“GNU’s Not Unix!”(GNU不是Unix)。GNU是一個(gè)類Unix的操作系統(tǒng),它包含一系列計(jì)算機(jī)軟件。
你可以嘗試通過操作系統(tǒng)的包管理器來安裝GCC和Clang,但是請(qǐng)注意,默認(rèn)的軟件倉庫可能只有老版本,它們可能并不支持C++17。如果不支持C++17,本書中的一些例子可能沒辦法編譯,所以你需要安裝新版本的GCC和Clang。為了簡(jiǎn)潔,這一章會(huì)介紹如何在Debian上以及如何從源碼安裝它們。你可以自行研究如何在自己選擇的Linux系統(tǒng)上執(zhí)行這些必要操作,也可以直接使用本章提到的操作系統(tǒng)來設(shè)置開發(fā)環(huán)境。
1.在Debian上安裝GCC和Clang
考慮到個(gè)人包管理存檔(Personal Package Archives,PPA)的狀態(tài),當(dāng)你閱讀本章的時(shí)候,你可以用Debian的包管理工具APT(Advanced Package Tool)直接安裝GCC 8.1以及Clang 6.0。本小節(jié)將展示如何在Ubuntu 18.04(編寫本書時(shí)最新的Ubuntu LTS版本)上安裝GCC和Clang:
1)打開終端。
2)更新并升級(jí)已經(jīng)安裝的包:

3)安裝GCC 8和Clang 6.0:

4)測(cè)試GCC和Clang:

如果以上任一命令報(bào)錯(cuò)說該命令沒有找到,則相應(yīng)的編譯器沒有安裝成功。嘗試搜索報(bào)錯(cuò)信息,尤其是在包管理器的文檔中和論壇上進(jìn)行搜索。
2.從源碼安裝GCC
如果無法在包管理器中找到最新版的GCC或者Clang(或者Unix變體根本沒有包管理器),那么可以嘗試從源碼安裝GCC。注意,這會(huì)花費(fèi)很多時(shí)間(長(zhǎng)達(dá)幾小時(shí)),并且可能需要手動(dòng)處理不少問題:安裝過程中常常會(huì)遇到錯(cuò)誤,因而需要研究如何解決。請(qǐng)參考https://gcc.gnu.org/上的步驟來安裝GCC。本小節(jié)總結(jié)了該網(wǎng)站上的文檔。
注意 為了簡(jiǎn)潔,該教程不會(huì)詳細(xì)講解Clang的安裝,有關(guān)Clang的更多信息,請(qǐng)參考https://clang.llvm.org/。
從源碼安裝GCC 8.1,請(qǐng)遵照以下步驟:
1)打開終端。
2)更新并升級(jí)已經(jīng)安裝的包。例如,使用APT需要執(zhí)行以下命令:

3)從https://gcc.gnu.org/mirrors.html選擇一個(gè)鏡像源,下載文件gcc-8.1.0.tar.gz和gcc-8.1.0.tar.gz.sig。這些文件可以在releases/gcc-8.1.0下找到。
4)檢查包的完整性(可選)。首先,導(dǎo)入相應(yīng)的GnuPG公鑰。公鑰可以在鏡像網(wǎng)站找到。例如:

校驗(yàn)下載的包:

上面的警告的意思是機(jī)器還沒有將簽名者的證書標(biāo)記為受信證書。要檢查簽名的確屬于包的擁有者,需要用其他的辦法校驗(yàn)簽名的密鑰(例如,親自與其本人見面或者使用其他渠道校驗(yàn)主密鑰的指紋)。想要了解更多GNU隱私保護(hù)(GNU Privacy Guard,GPG),請(qǐng)參閱Michael W. Lucas撰寫的PGP& GPG: Email for the Practical Paranoid或者瀏覽https://gnupg.org/download/integrity_check.html獲取有關(guān)GPG完整性檢查設(shè)施的具體信息。
5)解壓包(該命令可能需要執(zhí)行幾分鐘):

6)切換到剛剛創(chuàng)建的gcc-8.1.0文件夾:

7)下載GCC的安裝依賴項(xiàng):

8)用以下命令配置GCC:


相關(guān)配置指令見https://gcc.gnu.org/install/configure.html。
9)構(gòu)建GCC二進(jìn)制文件(可能晚上做比較好,因?yàn)檫@個(gè)過程需要幾小時(shí)):

完整的指令介紹見https://gcc.gnu.org/install/build.html。
10)測(cè)試GCC二進(jìn)制文件是否正確構(gòu)建:

完整的指令介紹見https://gcc.gnu.org/install/test.html。
11)安裝GCC:

該命令會(huì)將一些二進(jìn)制文件放到操作系統(tǒng)的可執(zhí)行文件的默認(rèn)目錄,一般是/usr/local/bin。完整的指令介紹見https://gcc.gnu.org/install/。
12)通過以下命令來檢查GCC是否正確安裝:

如果遇到命令無法找到的錯(cuò)誤,則說明沒有安裝成功。請(qǐng)參考位于https://gcc.gnu.org/ml/gcc-help/的gcc-help郵件列表來尋找解答。
注意 如果想要給冗長(zhǎng)的x86_64-pc-linux-gnu-gcc-8.1.0取個(gè)別名,如g++8,則可以使用以下命令:

13)切換到存放main.cpp的目錄,然后用GCC編譯程序:

14)-o選項(xiàng)是可選的,它告訴編譯器如何命名最終的程序。因?yàn)榻o程序取名hello,所以可以輸入./hello來執(zhí)行程序。如果碰到任何編譯錯(cuò)誤,請(qǐng)確保輸入的命令正確。(編譯錯(cuò)誤可以幫助你定位哪里出錯(cuò)了。)
1.2.5 文本編輯器
如果不想使用前面提到的IDE,也可以使用簡(jiǎn)單的文本編輯器[例如Notepad(Windows)、TextEdit(Mac)或者Vim(Linux)]來寫C++代碼,但是有一些優(yōu)秀的編輯器是專門為C++開發(fā)而設(shè)計(jì)的。建議選擇對(duì)自己來說最高效的開發(fā)環(huán)境。
如果你使用的是Windows或者macOS,那么你已經(jīng)有了一個(gè)高質(zhì)量、全功能的IDE了,即Visual Studio和Xcode。對(duì)于Linux,則可以選擇Qt Creator(https://www.qt.io/ide/)、Eclipse CDT(https:// eclipse.org/cdt/)和JetBrains的CLion(https://www.jetbrains.com/clion/)。如果使用Vim或者Emacs,那么可以找到大量的C++插件。
注意 如果跨平臺(tái)C++開發(fā)對(duì)你來說很重要,那么強(qiáng)烈推薦你試一下JetBrains的CLion。盡管CLion是付費(fèi)產(chǎn)品,和很多其他編輯器不一樣,但是截至編寫本書時(shí),JetBrains也有折扣,甚至免費(fèi)授權(quán)給學(xué)生及開源軟件維護(hù)人員。
- Java程序設(shè)計(jì)與開發(fā)
- C#程序設(shè)計(jì)實(shí)訓(xùn)指導(dǎo)書
- Python程序設(shè)計(jì)(第3版)
- JavaScript前端開發(fā)與實(shí)例教程(微課視頻版)
- 概率成形編碼調(diào)制技術(shù)理論及應(yīng)用
- C#程序設(shè)計(jì)基礎(chǔ):教程、實(shí)驗(yàn)、習(xí)題
- Java Web程序設(shè)計(jì)任務(wù)教程
- Serverless computing in Azure with .NET
- Visual Studio Code 權(quán)威指南
- MySQL程序員面試筆試寶典
- MINECRAFT編程:使用Python語言玩轉(zhuǎn)我的世界
- SpringBoot從零開始學(xué)(視頻教學(xué)版)
- Mockito Essentials
- SQL Server實(shí)例教程(2008版)
- HTML5與CSS3權(quán)威指南