Linux GCC 簡明教程(使用 GCC 編寫 C 語言程序)

市面上常見的 Linux 都是發行版本,典型的 Linux 發行版包含了 Linux 內核、桌面環境(例如 GNOME、KDE、Unity 等)和各種常用的必備工具(例如 Shell、GCC、VIM、Firefox 等),國內使用較多的是 CentOS、Ubuntu(烏班圖)、Debian、Redhat 等。

Linux 主要應用於各種服務器(例如網站服務器、數據庫服務器、DNS 服務器、郵件服務器、路由器、負載均衡集羣等),而不是我們常見的個人電腦。Linux 是服務器操作系統的絕對霸主,佔據了 80% 以上的份額,在未來的服務器領域,Linux 是大勢所趨。

這其中,又以 CentOS 和 Ubuntu 爲主,CentOS 佔有壓倒性的優勢。服務器操作系統 80% 以上的市場份額被 Linux 佔據,而 Linux 80% 以上的份額又被 CentOS 佔據。本教程以 CentOS 爲例來講述如何編譯 C 程序。

服務器上的 Linux 是不安裝圖形界面的,只能在控制檯模式下使用,以儘量節省服務器資源。而我們在學習過程中使用的 Linux 是帶圖形界面的,以滿足初學者的需求,降低學習成本。

在 Linux 下我們仍然可以使用帶界面的、傻瓜式的 IDE,例如 CodeLite、CLion(收費)、Code::Blocks、Netbeans、Eclipse CDT 等。微軟的 Visual Studio 也支持 Linux 了,在 Windows 下用慣了 Visual Studio 的用戶也可以毫無障礙地遷移到 Linux 平臺。

但是作爲初學者,我建議大家在命令行模式下編譯 C 語言程序,這樣能夠了解生成一個可執行程序的詳細步驟,以及編譯命令的各種設置選項,爲以後的 Linux C/C++ 開發打好堅實的基礎。

Gedit 編輯器

在 Linux 下,很多程序員都推崇使用 Vim、Emacs 等命令行模式的編輯器,它們功能強大,逼格夠高,不管有沒有桌面環境都能使用,是 Linux C/C++ 程序員必備的神器。但是 Vim 和 Emacs 並不容易上手,使用者需要記憶很多命令和快捷鍵,熟練才能生巧,所以需要一段時間的學習和適應,這會增加初學者的學習成本,所以這裏不推薦大家使用。
Ubuntu 和 CentOS 下都有一款自帶的圖形界面編輯器,叫做 Gedit。Gedit 是一款簡單實用的文本編輯器,界面優雅,支持語法高亮,比 Vim 容易上手,它和 Windows 下的編輯器沒有什麼兩樣。本教程將 Gedit 作爲 C 語言代碼的編輯器。

點擊終端 Terminal 圖標或 Ctrl+Alt+T 打開終端,在終端中右鍵 New Tab 可以在一個 Windos 下建立多個 Tab,每個 Tab 都可以輸入命令,終端打開某些軟件後無法繼續輸入指令,所以可以在另一個 Tab 操作,

在終端中執行以下操作:

回到用戶目錄下:cd ~ 

查看當前用戶目錄路徑:pwd

 新建文件夾:mkdir CProgram

查看新建文件夾,展示當前文件夾列表:ls

進入 CProgram 文件夾:cd CProgram

新建 01_base 文件夾:mkdir 01_base

進入 01_base 文件夾:cd 01_base

新建文件 hello.c: gedit hello.c

如果系統沒有安裝 gedit 編輯器,按照如下操作

如果你使用的是其它的 Linux 發行版,可能沒有默認安裝 Gedit,這個時候就得自己安裝,具體步驟爲:

$ sudo apt-add-repository ppa:ubuntu-on-rails/ppa    #添加 ubuntu 的軟件源
$ sudo apt-get update    #更新軟件列表
$ sudo apt-get install gedit-gmate    #安裝

用戶目錄有時候也叫 home 文件夾或者主文件夾,它的路徑是/home/username,其中 username 就是我們登錄 Linux 時使用的用戶名。Linux 會在 home 目錄下爲每一個登錄的用戶創建一個文件夾,專門用來存放該用戶使用到的配置文件、文本文檔、圖片、可執行程序等,以和其他用戶區分開來。

在 Gedit 中輸入下面的 C 語言代碼:

#include "stdio.h"

int main()

{

	printf("Welcom to world!");

	return 0

}

Ctrl+S保存文件,就完成了源代碼的編輯工作。此時需要關閉 Gedit 的窗口,$ gedit hello.c命令纔算執行結束,才能在控制檯繼續輸入其它命令。

注意,在 Ubuntu 下,使用touch命令創建完 hello.c 後,進入文件所在目錄,在右鍵菜單中也可以使用已有的編輯器打開文件:

GCC 編譯器

Linux 下使用最廣泛的 C/C++ 編譯器是 GCC,大多數的 Linux 發行版本都默認安裝,不管是開發人員還是初學者,一般都將 GCC 作爲 Linux 下首選的編譯工具。本教程也毫不猶豫地使用 GCC 來編譯 C 語言程序。
GCC 僅僅是一個編譯器,沒有界面,必須在命令行模式下使用。通過gcc命令就可以將源文件編譯成可執行文件。

1) 生成可執行程序

最簡單的生成可執行文件的寫法爲:

$ cd 01_base  #進入源文件所在的目錄
$ gcc hello.c  #在 gcc 命令後面緊跟源文件名

打開 01_base 目錄,會看到多了一個名爲 a.out 的文件,這就是最終生成的可執行文件,如下圖所示:

這樣就一次性完成了編譯和鏈接的全部過程,非常方便。

注意:不像 Windows,Linux 不以文件後綴來區分可執行文件,Linux 下的可執行文件後綴理論上可以是任意的,這裏的.out只是用來表明它是 GCC 的輸出文件。不管源文件的名字是什麼,GCC 生成的可執行文件的默認名字始終是a.out

如果不想使用默認的文件名,那麼可以通過-o選項來自定義文件名,例如:

$ gcc hello.c -o hello.out

這樣生成的可執行程序的名字就是main.out
因爲 Linux 下可執行文件的後綴僅僅是一種形式上的,所以可執行文件也可以不帶後綴,例如:

$ gcc hello.c -o hello

這樣生成的可執行程序的名字就是main
通過-o選項也可以將可執行文件輸出到其他目錄,並不一定非得在當前目錄下,例如:

$ gcc hello.c -o ./out/hello.out

或者

$ gcc hello.c -o out/hello.out

表示將可執行文件輸出到當前目錄下的out目錄,並命名爲hello.out./表示當前目錄,如果不寫,默認也是當前目錄。

注意:out 目錄必須存在,如果不存在,gcc 命令不會自動創建,而是拋出一個錯誤。

2) 運行可執行程序

上面我們生成了可執行程序,那麼該如何運行它呢?很簡單,在控制檯中輸入程序的名字就可以,如下所示:

$ ./hello.out

./表示當前目錄,整條命令的意思是運行當前目錄下的 hello.out 程序。如果不寫./,Linux 會到系統路徑下查找 hello.out,而系統路徑下顯然不存在這個程序,所以會運行失敗。

所謂系統路徑,就是環境變量指定的路徑,我們可以通過修改環境變量添加自己的路徑,或者刪除某個路徑。很多時候,一條 Linux 命令對應一個可執行程序,如果執行命令時沒有指明路徑,那麼就會到系統路徑下查找對應的程序。

輸入完上面的命令,按下回車鍵,程序就開始執行了,它會將輸出結果直接顯示在控制檯上,如下所示:

$ cd 01_base
$ gcc hello.c
$ ./out/hello.out
Welcom to world!$

下圖演示了在控制檯上的實際效果:

如果程序在其它目錄下,運行程序時還要帶上目錄的名字,例如:

$ ./out/hello.out

或者

$ out/hello.out

這個時候加不加./都一樣,Linux 能夠識別出out是一個目錄,而不是一個命令,它默認會在當前路徑下查找該目錄,而不是去系統路徑下查找,所以不加./也不會出錯。
注意,如果程序沒有執行權限,可以使用sudo命令來增加權限,例如:

$ sudo chmod 777 hello.out

分步驟編譯

上面講解的是通過gcc命令一次性完成編譯和鏈接的整個過程,這樣最方便,大家在學習 C 語言的過程中一般都這麼做。實際上,gcc命令也可以將編譯和鏈接分開,每次只完成一項任務。

1) 編譯(Compile)

將源文件編譯成目標文件需要使用-c選項,例如:

gcc -c hello.c

就將 main.c 編譯爲 main.o。打開 demo 目錄,就會看到 main.o:

對於微軟編譯器(內嵌在 Visual C++ 或者 Visual Studio 中),目標文件的後綴爲.obj;對於 GCC 編譯器,目標文件的後綴爲.o
一個源文件會生成一個目標文件,多個源文件會生成多個目標文件,源文件數目和目標文件數目是一樣的。通常情況下,默認的目標文件名字和源文件名字是一樣的。
如果希望自定義目標文件的名字,那麼可以使用-o選項,例如:

gcc -c hello.c -o a.o

這樣生成的目標文件的名字就是 a.o。

gcc命令後面緊跟目標文件的名字,就可以將目標文件鏈接成爲可執行文件,例如:

gcc hello.o

就將 hello.o 鏈接爲 a.out。打開 demo 目錄,就會看到 a.out。
gcc命令後面緊跟源文件名字或者目標文件名字都是可以的,gcc命令能夠自動識別到底是源文件還是目標文件:如果是源文件,那麼要經過編譯和鏈接兩個步驟才能生成可執行文件;如果是目標文件,只需要鏈接就可以了。
使用-o選項仍然能夠自定義可執行文件的名字,例如:

gcc hello.o -o hello.out

這樣生成的可執行文件的名字就是 hello.out。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ihYSqlDSqSPzAK4_2Ot4qQ