Linux 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 并不容易上手,使用者需要記憶很多命令和快捷鍵,熟練才能生巧,所以需要一段時間的學習和適應,這會增加初學者的學習成本,所以這里不推薦大家使用。

CentOS 下有一款自帶的圖形界面編輯器,叫做?Gedit。Gedit 是一款簡單實用的文本編輯器,界面優雅,支持語法高亮,比 Vim 容易上手,它和 Windows 下的編輯器沒有什么兩樣。本教程將 Gedit 作為C語言代碼的編輯器。

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

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

首先,在我們自己的用戶目錄下新建一個名為demo的文件夾。這個文件夾專門用來存放與C語言相關的文件,例如源文件、目標文件、可執行文件等,它專供我們學習使用。

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

接下來需要創建一個空白的 main.c 源文件。main.c 其實就是一個純文本文件,并沒有任何特殊格式,但是 Linux 不像 Windows,可以在右鍵菜單中新建文本文檔,Linux 必須使用命令來創建,如下所示:

$ cd demo? #進入 demo 目錄,這是源文件所在的目錄
$ touch main.c? #使用 touch 命令創建一個名為 main.c 的空文件
$ gedit main.c? #使用 gedit 命令編輯 main.c

這樣就完成了源文件的創建,并能夠使用 Gedit 編輯源文件了。
?

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

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

注意,在 CentOS 下,使用touch命令創建完 main.c 后,進入 demo 目錄,在右鍵菜單中也可以使用 Gedit 打開 main.c,如下圖所示:

GCC 編譯器

Linux 下使用最廣泛的 C/C++ 編譯器是 GCC,大多數的 Linux 發行版本都默認安裝,不管是開發人員還是初學者,一般都將 GCC 作為 Linux 下首選的編譯工具。本教程也毫不猶豫地使用 GCC 來編譯C語言程序。

GCC 僅僅是一個編譯器,沒有界面,必須在命令行模式下使用。通過gcc命令就可以將源文件編譯成可執行文件。

1) 生成可執行程序

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

$ cd demo? #進入源文件所在的目錄
$ gcc main.c? #在 gcc 命令后面緊跟源文件名

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

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

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

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

$ gcc main.c -o main.out

這樣生成的可執行程序的名字就是main.out

因為 Linux 下可執行文件的后綴僅僅是一種形式上的,所以可執行文件也可以不帶后綴,例如:

$ gcc main.c -o main

這樣生成的可執行程序的名字就是main

通過-o選項也可以將可執行文件輸出到其他目錄,并不一定非得在當前目錄下,例如:

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

或者

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

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

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

2) 運行可執行程序

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

$ ./a.out

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

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

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

$ cd demo
$ gcc main.c
$ ./a.out
啦啦啦啦啦
$

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

$ ./out/main.out

或者

$ out/main.out

這個時候加不加./都一樣,Linux 能夠識別出out是一個目錄,而不是一個命令,它默認會在當前路徑下查找該目錄,而不是去系統路徑下查找,所以不加./也不會出錯。

注意,如果程序沒有執行權限,可以使用sudo命令來增加權限,例如:

$ sudo chmod 777 a.out

完整的演示

為了讓讀者有一個更加全面的認識,我們不妨將上面兩部分的內容連接起來,完整的演示一下從編輯源文件到運行可執行程序的全過程:

$ cd demo? #進入源文件所在目錄
$ touch main.c? #新建空白的源文件
$ gedit main.c? #編輯源文件
$ gcc main.c? #生成可執行程序
$ ./a.out? #運行可執行程序
啦啦啦啦啦
$? ?#繼續等待輸入其它命令

分步驟編譯

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

1) 編譯(Compile)

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

gcc -c main.c

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

對于微軟編譯器(內嵌在 Visual C++ 或者 Visual Studio 中),目標文件的后綴為.obj;對于 GCC 編譯器,目標文件的后綴為.o

一個源文件會生成一個目標文件,多個源文件會生成多個目標文件,源文件數目和目標文件數目是一樣的。通常情況下,默認的目標文件名字和源文件名字是一樣的。

如果希望自定義目標文件的名字,那么可以使用-o選項,例如:

gcc -c main.c -o a.o

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

2) 鏈接(Link)

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

gcc main.o

就將 main.o 鏈接為 a.out。打開 demo 目錄,就會看到 a.out。

gcc命令后面緊跟源文件名字或者目標文件名字都是可以的,gcc命令能夠自動識別到底是源文件還是目標文件:如果是源文件,那么要經過編譯和鏈接兩個步驟才能生成可執行文件;如果是目標文件,只需要鏈接就可以了。

使用-o選項仍然能夠自定義可執行文件的名字,例如:

gcc main.o -o main.out

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444086.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444086.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444086.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle中如何獲取當天時間的最開始的時間和最結尾的時間:

如下: 1.獲取當前時間的最開始的時間: select to_char(TRUNC(SYSDATE),yyyy-mm-dd hh24:mi:ss) from dual; 結果:2013-08-26 00:00:00 2.獲取當前時間的最結尾的時間: selectTRUNC(SYSDATE)1-1/86400 FROM dual; 結果&#x…

解決VS'scanf':this function or variable may be unsafe.`(VS安全函數問題)

在 VS(Visual Studio)下編譯C語言程序,如果使用了 scanf()、gets()、strcpy()、strcat() 等與字符串讀取或操作有關的函數,有時候VS會報錯,提示該函數可能不安全,并且建議替換為帶有_s后綴的安全函數&#…

雙向循環鏈表【數據結構】

單鏈表的缺點以及對單鏈表缺點的改進和雙向鏈表的理解操作 雙向循環列表的插入操作 線性結構是一種邏輯結構,順序存儲結構,鏈式存儲結構

什么是編譯器?(程序是怎么跑起來的)

我們平時所說的程序,是指雙擊后就可以直接運行的程序,這樣的程序被稱為可執行程序(Executable Program)。在 Windows 下,可執行程序的后綴有 .exe 和 .com(其中 .exe 比較常見);在類…

C++std命名空間和頭文件詳解

一個中大型軟件往往由多名程序員共同開發,會使用大量的變量和函數,不可避免地會出現變量或函數的命名沖突。當所有人的代碼都測試通過,沒有問題時,將它們結合到一起就有可能會出現命名沖突。 例如小李和小韓都參與了一個文件管理系…

C++ new和delete

在C語言中,動態分配內存用 malloc() 函數,釋放內存用 free() 函數。如下所示: int *p (int*) malloc( sizeof(int) * 10 ); //分配10個int型的內存空間free(p); //釋放內存 在cpp中,這兩個函數仍然可以使用,但是C又…

Java 的內存管理機制是怎樣的?

Java 的內存管理機制是怎樣的?

leetcode1103. 分糖果 II 該模擬就模擬,別老想著優化

排排坐,分糖果。 我們買了一些糖果 candies,打算把它們分給排好隊的 n num_people 個小朋友。 給第一個小朋友 1 顆糖果,第二個小朋友 2 顆,依此類推,直到給最后一個小朋友 n 顆糖果。 然后,我們再回到…

leetcode912. 排序數組 有范圍的排序統統用桶排序

給你一個整數數組 nums&#xff0c;請你將該數組升序排列。 示例 1&#xff1a; 輸入&#xff1a;nums [5,2,3,1] 輸出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 輸入&#xff1a;nums [5,1,1,2,0,0] 輸出&#xff1a;[0,0,1,1,2,5] 提示&#xff1a; 1 < nums.len…

隊列【數據結構】

注意 我們的銷毀隊列是否能夠成功取決申請空間的方式&#xff0c;動態申請出來的空間都是可以進行銷毀的&#xff0c;對于靜態的話是不能直接進行銷毀的 ADT 相當于是c當中的類結構&#xff0c;是處理數據時&#xff0c;提前對數據進行一定的管理操作&#xff0c;就是將某一件事…

C++繼承詳解

廢話不多說直接上代碼 class 派生類名:&#xff3b;繼承方式&#xff3d; 基類名{ 派生類新增加的成員 }; 繼承方式限定了基類成員在派生類中的訪問權限&#xff0c;包括 public&#xff08;公有的&#xff09;、private&#xff08;私有的&#xff09;和 protected&…

串【數據結構F】

先來講解一下串結構的概念性質的東西&#xff0c;以及我們需要注意的一些問題 串結構簡單的ADT以及一些基本的操作 最小操作函數&#xff1a;就是功能已經達到了最小的功能實現了&#xff0c;不能繼續執行更大的功能&#xff0c;類似于我們在家蓋房子一樣&#xff0c;水泥的…

C++ STL與迭代器

將容器類模板實例化時&#xff0c;會指明容器中存放的元素是什么類型的&#xff1a;可以存放基本類型的變量&#xff0c;也可以存放對象。 對象或基本類型的變量被插入容器中時&#xff0c;實際插入的是對象或變量的一個復制品。 STL 中的許多算法&#xff08;即函數模板&…

在JSP頁面中輸出JSON格式數據

JSON-taglib是一套使在JSP頁面中輸出JSON格式數據的標簽庫。 JSON-taglib主頁&#xff1a; http://json-taglib.sourceforge.net/index.html JAR包下載地址&#xff1a; http://sourceforge.net/projects/json-taglib/files/latest/download 使用方法&#xff1a; 1、下載js…