在 Windows 下用 GCC 編譯器練習 C/C++ 的簡單教程
- 2019 年 11 月 24 日
- 筆記
2018年8月更新: 這個暑假部落客和小夥伴、老師一同為師弟師妹們折騰了一個關於電腦學習交流的小社區 0xFFFF ,經過一個暑假的積澱,留下了不少適合電腦入門閱讀的內容,推薦給看到這篇文章的你。 關於電腦新手入門的話題 – 0xFFFF
————— 開始正文 —————- 最近有許多師弟師妹們問入門 C 語言和 C++ 的時候練習程式碼應該裝什麼軟體。
根據老師和前輩們的建議以及我這一年的折騰經驗,在 Linux 系統下學習 C 語言和 C++ 的話那真是極好的,但是鑒於現實的情況(例如 Linux 命令行操作對於一個暫時對電腦不是非常了解的人來說可能一開始不太好上手),很多東西還是需要在 Windows 下進行。
在 Windows 下編程,大多數人用的是「宇宙最強IDE」—— Visual Studio (ps: IDE 是集成開發環境的簡稱),VS 的確好用,基本把你需要的東西都準備好了,然而裝過的人都知道,裝這東西有時候可以折騰你一下午,沒設置好的話可能一下子裝了幾 GB 現在的我們還不知道是拿來幹什麼的東西。
師兄推薦了 Code::Blocks 這個相比 VS 更簡潔的IDE,但我覺得可以更簡單。
所以我推薦 文本編輯器 + GCC 編譯器 這個無敵組合,在入門階段已經足夠了。
為什麼用這個組合而不是直接上IDE
關注本質
首先我們得對 C 語言/ C++ 程式的運行流程有一個基本的認識,從 Think-C 的1.1節我們可以知道。C/C++的源程式碼 (source code) 需要經過編譯 (compiling) 這個過程轉換為二進位可執行文件才能運行。
本質上來說,其實所有的 C、C++、Java、Python 等語言的源程式碼(對應的源文件後綴分別為.c .cpp .java .py等)都屬於文本文件,除了後綴名之外沒有其它差別,所以它們都可以通過文本編輯器編輯。
寫好程式碼,通過編譯器把程式碼編譯成可執行文件,寫的程式就能運行了。
所以說,入門 C語言/ C++ 編程,實際上我們只需要兩個工具:文本編輯器、編譯器。其它的諸如調試器等工具都是圍繞著它們工作的。
類似 Visual Studio,Code::Blocks 這樣的 IDE ,它也可以說是文本編輯器以及編譯器和調試器等等工具的結合體,它們是為了高效解決工程問題的產物。
為了工程上的效率,IDE隱藏了許多細節,通過IDE入門編程,點擊編譯按鈕的背後,IDE為我們做了什麼事情,我們並不容易注意到,且初學時我們也用不上太複雜的東西,剛開始就使用過於大而全的工具容易陷入迷茫。例如 Visual Studio 里「解決方案資源管理器」之類的介面,還有裝 Visual Studio 的時候裝上的各種各樣奇奇怪怪的組件(實際上它們都不是重點)。
我們寫程式碼總不可能依賴於某個編程工具,所以趁現在寫的東西還不複雜的時候,多多了解、親身體驗一下那些相對更底層的東西,對我們的發展是很有幫助的。
以後我們寫相對複雜的項目,基本的功能滿足不了我們的需要的時候,再選擇一個強大的 IDE 來幫助我們更好地組織管理我們的程式碼,我認為這是一個適合初學者的較為平緩的學習路徑。
通過GCC的使用初步了解命令行
入門階段的我們寫的程式基本是在命令行(又叫終端)下運行的,即使你直接在Windows的圖形介面下運行這些程式,系統還是要彈出一個命令行窗口為它提供一個運行的環境,熟悉命令行的重要性不言而喻。
GCC全套工具都是在命令行下使用的,還有許多優秀的工具和程式,例如 Python 解釋器、Node.js 以及依賴 Node.js 的一系列網頁前端開發的構建工具、以後工作或參與開源項目時肯定會用到的 Git,SVN 等版本控制工具等等,也是在命令行下運行的。在使用GCC的過程中我們可以收穫很多關於命令行的概念和使用技巧,對命令行有一個初步的印象。
學習電腦,我們無可避免的要接觸到 Linux 作業系統。通過 GCC 編譯器的使用,也可以為我們熟悉 Linux 建立一點基礎。Linux 內核作為 Unix 內核的開源實現,在命令行方面的功能是非常強大的,圍繞著 Linux 內核有許許多多優秀的應用程式,GCC 只是它其中的冰山一角。工具繁多,一開始總會讓人感到眼花繚亂,學習曲線也相對陡峭。
平時我們可能熟悉 Windows 多一些,在 Windows 中,命令行與 Linux 有許多相似之處,從 Windows 熟悉命令行開始也可以作為一個過渡的方式。
節省磁碟空間
值得關注的是,相比 VS 動輒上 GB 的空間佔用,這個裝完最多也就佔用幾百M硬碟空間,豈不美哉?
關於 GCC 的介紹
關於GCC的發展史,推薦閱讀: 鳥哥的Linux私房菜
文本編輯器的選擇與安裝
說到文本編輯器,我們第一時間想到的應該就是記事本了,但是有一點大家要注意,不推薦使用記事本編輯程式碼。原因是 Windows 自帶的記事本編輯的 Unicode 文本文件頭部會自帶 BOM,BOM 在某些環境下會出現問題,參考知乎上的這個回答 補充閱讀:「帶 BOM 的 UTF-8」和「無 BOM 的 UTF-8」有什麼區別?網頁程式碼一般使用哪個? – 知乎。
適合寫程式碼用的文本編輯器有很多,這裡推薦的有:Vim,Emacs,Atom,VSCode,Notepad++,Sublime Text等。我們可以多多嘗試,用心去感受一下它們各自的特點,然後選一個喜歡的作為陪伴我們編程生涯的主力文本編輯器。
以上提到的文本編輯器,除了 Notepad++ 只支援 Windows 之外,其它的編輯器在 Windows,Linux,macOS 下都有各自的版本。它們都支援安裝各種插件實現特定領域的強大功能,限於篇幅這裡先不說了。
在這裡我用的是 Atom(點擊進入官網)
2018.05.09 更新 部落客現在已經轉投 VS Code 編輯器,VS Code 的設計對初學者也更友好一些 點擊鏈接直達官網下載地址 https://code.visualstudio.com/Download VSCode 安裝與使用方法與 Atom 類似 由於截圖的工程量較大,所以這裡就不更新截圖啦~
鑒於國外伺服器下載速度較慢的原因,建議從淘寶的 npm 源鏡像裡面下載最新版 Atom 安裝文件,截至這篇文章發表之時它更新到了 1.19.0 版
https://npm.taobao.org/mirrors/atom/
在網頁上我們可以看到有一大堆不同平台的安裝文件在上面,我們下載 AtomSetup-x64.exe
下載好之後和一般的軟體一樣,打開安裝就行,安裝好後我們發現桌面多了這個圖標。 說明編輯器已經可以用了。
GCC編譯器的安裝
GCC是個跨平台的開源的編譯工具套裝,自然在 Windows 下也會有相應的集成包,一般用的比較多的有 MinGW、MinGW-w64 和 TDM-GCC ,三者的區別和聯繫可以參考這篇博文,這裡我們用的是TDM-GCC。
ps: Code::Blocks、Dev-C++ 軟體默認也是使用 GCC 編譯器編譯程式碼的
打開TDM-GCC的官網 ,點擊中間的 "TDM64 bundle" 下載安裝包,運行安裝包
點擊 Create,開始一個新的安裝
我們用的基本都是64位的電腦,當然是選擇64位啦。
一路Next就可以了
整個安裝嚮導跑完之後,GCC 編譯器就已經在你的電腦上了,剛剛提到,這是個在命令行下運行的程式,沒有圖形介面。
我們先驗證一下 GCC 有沒有安裝好。
首先隨便打開一個文件夾(桌面也可),按住 shift 鍵,右擊空白處,你會發現右鍵菜單多了一項「在此處打開命令窗口」,如果你安裝了 Windows 10 的最新更新,你看到的會和截圖一樣,打開的是 PowerShell ,沒關係!兩個東西除了介面和一些具體的功能不一樣,用起來是差不多的。
打開之後我們發現它提示了我打開的文件夾的路徑,路徑的後面可以通過鍵盤輸入文字,意思是接下來的命令是基於這個文件夾路徑運行的。
我們在裡面輸入 gcc 然後回車,如果返回了一個 fetal error: no input files 的錯誤提示的話,說明 gcc 已經裝好並且可以使用了。
這是默認的 CMD(ps: CMD 是 Windows 希望淘汰但因為兼容舊版不得不保留的東西)
這是 PowerShell 的效果
如果返回的是「gcc 不是內部或外部命令,也不是可運行的程式或批處理文件。」的話,說明沒裝好,可能需要重新試一下,或者是通過重啟 Windows 來使 tdm-gcc 集成包安裝時給系統設置的環境變數生效。(這裡涉及到了「環境變數」的概念,建議主動搜索一下,電腦就是這麼一個錯綜複雜的知識網路呢^_^)
到這裡,文本編輯器和編譯器已經準備好啦,接下來我再介紹怎麼用它們運行程式碼。
補充知識:用戶在使用作業系統的過程中,需要與作業系統的內核交互,這個交互的過程,是通過「殼層」來實現的,英文名為Shell。「殼層」主要分為兩類,一類是圖形介面(GUI:Graphicial User Interface),另一類是命令行介面(CLI:Command-line Interface),作為一名未來的開發者,除了平常使用的圖形介面外,高效精準的命令行介面是不能忽視的。PowerShell 與 CMD 一樣,都屬於 CLI 類型的 Shell 程式。關於 Shell 的更多概念,推薦閱讀 鳥哥的 Linux 私房菜 — 學習 bash shell。
使用方法
寫程式碼
沒有了IDE的一鍵編譯程式碼按鈕,自然這些操作都需要手動來,聽起來很麻煩的樣子?
不用擔心!就算是手動,也不會麻煩,至少比你裝 Visual Studio 全家桶簡單。
下面讓我演示一下在這個環境下,程式是怎麼跑起來的。
首先第一步還是先寫寫源程式碼,打開 Atom,點擊菜單欄的 File > New File 新建一個文本文件,然後File > Save 定位到一個你想用來放程式碼的文件夾,文件名取一個後綴為 .c 的名字就好。
保存之後就可以開始寫了,寫好再繼續保存
接下來進入放源程式碼的文件夾,同樣的方法,按住Shift在空白處點擊右鍵,打開命令行窗口
這時候我們運行 gcc 把 first.c 編譯成 Windows 可用的可執行文件,命令很簡單
gcc first.c
ps: 如果你寫的是C++,則需要用 g++ 調用GCC的C++編譯器而不是 C語言編譯器 gcc ,假定源文件是 first.cpp
g++ first.cpp
輸入完後回車,這時候gcc開始編譯你告訴它的文件了,稍等片刻,等這一條命令結束,命令行出現了新的提示符以後,編譯就完成了
我們可以發現,這個文件夾多了個名為 a.exe 的程式,這就是我們編譯好以後可以運行的程式了。
下一步,在命令行裡面執行這個程式,輸入
.a.exe
發現 PowerShell 窗口裡面輸出了我想要它輸出的字元串,然後程式結束了,再一次出現了新的提示符
愛動腦筋的同學可能會想,既然是個exe那我就不能雙擊運行么?
當然可以,那就雙擊打開試試!!
……
打開後發現,它彈出一個窗口,但是我還沒看清它就消失了,這是為什麼呢?
前文有提到過,我們寫的是基於命令行的程式,如果脫離命令行環境直接運行的話,Windows 會創建一個命令行窗口給它提供一個運行的環境,這時候命令行窗口屬於這個程式的進程(嗷,這裡又扯到了「進程」這個概念了,不明白的話趕緊搜索一下)。這個程式啟動後,執行完向命令行列印字元的操作,告訴系統,我已經順利執行完畢啦,於是它的生命周期結束。自然,Windows 系統要把它之前申請的資源都回起來,包括那個彈出的命令行窗口,於是系統銷毀了那個彈出來的命令行窗口。
當程式在命令行下運行時候,程式使用的命令行窗口屬於執行它的命令行窗口的進程(CMD或者PowerShell),程式退出以後,命令行實際還是在運行的,因而窗口不會銷毀,程式留下的記錄仍然可以得到保留。
有沒有一種雙擊打開程式不讓命令行窗口一閃而過的方法呢?答案是肯定的。如果我們能讓程式運行的時候停留在某個步驟不動,那麼它就可以保持不退出啦,一般在 Windows 下我們常用的暫停語句是 system("pause"); ,這個語句是通過執行命令行的 pause 命令來實現讓程式暫停的功能(和你在命令行輸入 pause 回車一樣的效果,建議你自己試一試),程式執行到這一步,提示「按任意鍵繼續」,程式暫停,當你按任意鍵以後,程式才繼續向下執行,就不會停不下來立馬退出了。
錯誤處理
如果源程式碼有語法錯誤的話,編譯時編譯器會報錯並且不會生成目標程式碼。
這裡我故意把第5行最後的分號刪掉,再運行 gcc 命令編譯,提示第六行第五個字元的 return 之前少了分號,編譯失敗。
錯誤定位辦法參考師兄的文章
至此,我們可以開始愉快地練習程式碼啦!
這裡講兩個命令行的小技巧:一是命令行執行過的命令會有歷史記錄,我們可以通過按上下方向鍵來切換之前執行過的命令;二是我們填文件名的時候如果它太長了的話,可以先輸入前面一小部分,然後按 Tab 鍵就可以自動補全了。
命令行中還蘊藏著無限的可能,等待著你的探索。
最後想說的
剛開始入門電腦時,可能你會對選擇命令行還是圖形介面、對學習編程的方式有些迷茫,這裡我也試圖提供一些相關的資訊和我的一些想法,希望可以帶來幫助。
貼一個我在知乎上看到的回答 (原文鏈接)
我想,學習一門程式語言,並不是像我們以前學英語那樣,總是研究這個語法那個用法而脫離了實際的應用。我們作為電腦專業的學生,學這些東西並不是像別的專業那樣為了考證而學,而是應該把它用起來。一門程式語言的很多特性,和實際的應用和系統的運行緊密相關。僅僅盯著語言的語法和表面的東西,大概會像我身邊有一些小夥伴一樣,光跟著譚浩強課本學了一年的C++語法,到現在還是一頭霧水。
這裡也引用一段來自 前言 – Linux C編程一站式學習 的話:
為什麼要在Linux平台上學C語言?用Windows學C語言不好嗎? 用Windows還真的是學不好C語言。C語言是一種面向底層的程式語言,要寫好C程式,必須對作業系統的工作原理非常清楚,因為作業系統也是用C寫的,我們用C寫應用程式直接使用作業系統提供的介面。既然你選擇了看這本書,你一定了解:Linux是一種開源的作業系統,你有任何疑問都可以從源程式碼和文檔中找到答案,即使你看不懂源程式碼,也找不到文檔,也很容易找個高手教你,各種郵件列表、新聞組和論壇上從來都不缺樂於助人的高手;而Windows是一種封閉的作業系統,除了微軟的員工別人都看不到它的源程式碼,只能通過文檔去猜測它的工作原理,更糟糕的是,微軟向來喜歡藏著揶著,好用的功能留著自己用,而不會寫到文檔里公開。本書的第一部分在Linux或Windows平台上學習都可以,但第二部分和第三部分介紹了很多Linux作業系統的原理以幫助讀者更深入地理解C語言,只能在Linux平台上學習。 Windows平台上的開發工具往往和各種集成開發環境(IDE,Integrated Development Environment)綁在一起,例如Visual Studio、Eclipse等。使用IDE確實很便捷,但IDE對於初學者絕對不是好東西。微軟喜歡宣揚傻瓜式編程的理念,告訴你用滑鼠拖幾個控制項,然後點一個按鈕就可以編譯出程式來,但是真正有用的程式有哪個是這麼拖出來的?很多從Windows平台入門學編程的人,編了好幾年程式,還是只知道編完程式點一個按鈕就可以跑了,把幾個源文件拖到一個項目里就可以編譯到一起了,如果有更複雜的需求他們就傻眼了,因為他們腦子裡只有按鈕、菜單的概念,根本沒有編譯器、鏈接器、Makefile的概念,甚至連命令行都沒用過,然而這些都是初學編程就應該建立起來的基本概念。另一方面,編譯器、鏈接器和C語言的語法有密切的關係,不了解編譯器、鏈接器的工作原理,也不可能真正掌握C的語法。所以,IDE並沒有幫助你學習,而是阻礙了你學習,本來要學好C編程只要把語法和編譯命令學會就行了,現在有了IDE,除了學會語法和編譯命令,你還得弄清楚編譯命令和IDE是怎麼集成的,這才算學明白了,本來就很複雜的學習任務被IDE搞得更加複雜了。Linux用戶的使用習慣從來都是以敲命令為主,以滑鼠操作為輔,從學編程的第一天起就要敲命令編譯程式,等到你把這些基本概念都搞清楚了,你覺得哪個IDE好用你再去用,不過到那時候你可能會更喜歡vi或emacs而不是IDE了。
Windows 系統相對更加強調圖形化一些,圖形化優勢在於直觀。但也容易讓人迷惑,總是貪圖著簡單方便,不求甚解,大概會更加地趨於平庸。Unix系列的 Linux 強調效率,在命令行方面做的是非常地完善好用。
關於命令行和圖形化哪個好的問題,需要結合具體的應用場景來看待,在不同的場景中它們各有各的利弊。
私以為圖形介面比較適合做一些強調直觀的工作,比如說多媒體編輯,類似PS、影片、音頻編輯等。類似「讓照片裡面的妹紙臉上的痘痘消失」這樣子的需求,要做這個工作,你總不可能用命令行輸入一個個像素去調吧。
對於編程開發這樣大部分時間需要高度精確、且經常遇到重複操作的工作來說,命令行更加適合一些。修改命令參數,再執行一次命令,與每次都要彈個窗口修改,然後點擊確定按鈕這一連串操作相比,顯然要簡單舒服許多。
引用一則著名的文章:《無名師的GUI論》 (原文:Master Foo Discourses on the Graphical User Interface )
一晚,無名師和Nubi參加一個程式設計師的探討會。有個程式設計師問Nubi和他的老師來自哪所學校。當得知他們是Unix大道的追隨者時,程式設計師頗為不屑。 「Unix命令行工具太粗糙太落後」,他譏諷道。「現代的、設計得當的作業系統可以在圖形用戶介面中做任何事情。」 無名師一言不發,只是指著月亮。旁邊的一條狗對著他的手狂吠。 「我不明白。」程式設計師說。 無名師依然緘默,指著一幅佛祖像,然後又指著一扇窗。 「你想說什麼?」程式設計師問。 無名師指著程式設計師的頭,接著指著一塊大石。 「請把話說清楚!」程式設計師要求道。 無名師深深蹙眉,輕拍程式設計師的鼻子兩下,把他扔到旁邊的垃圾箱中。 程式設計師試圖從垃圾堆掙扎出來之時,那條狗跑過來在他身上便溺。 此時,程式設計師眼中一亮。
或許有人會說,大家都在用 Windows,VC,我為什麼要折騰這些?放眼望去,電腦在不斷地高速發展變化之中,而學院的課程總是在「照顧」著大多數人,如果你僅僅只是跟著學院安排的課程,按部就班地學,那是遠遠不夠的。電腦科學是一門自主性非常強的學科。需要鍛煉自己的自學能力。所以也希望大家可以多多折騰,互相多多交流,多多進步。
遇到困難的時候,我們有互聯網,還有一群熱愛折騰的小夥伴們和熱心的老師,所以放心大膽地去干吧!
如果有什麼疑問的話,希望可以儘快提出。