GCC編譯器簡明教程(Linux下C語言開發(fā)環(huán)境的搭建)


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

Linux 主要應(yīng)用于各種服務(wù)器(例如網(wǎng)站服務(wù)器忱叭、數(shù)據(jù)庫服務(wù)器埂息、DNS服務(wù)器、郵件服務(wù)器千康、路由器享幽、負(fù)載均衡集群等),而不是我們常見的個(gè)人電腦拾弃。Linux 是服務(wù)器操作系統(tǒng)的絕對霸主值桩,占據(jù)了 80% 以上的份額,在未來的服務(wù)器領(lǐng)域豪椿,Linux 是大勢所趨奔坟。

這其中携栋,又以 CentOS 和 Ubuntu 為主,CentOS 占有壓倒性的優(yōu)勢咳秉。服務(wù)器操作系統(tǒng) 80% 以上的市場份額被 Linux 占據(jù)婉支,而 Linux 80% 以上的份額又被 CentOS 占據(jù)。本教程以 CentOS 為例來講述如何編譯C程序澜建。

服務(wù)器上的 Linux 是不安裝圖形界面的向挖,只能在控制臺模式下使用,以盡量節(jié)省服務(wù)器資源炕舵。而我們在學(xué)習(xí)過程中使用的 Linux 是帶圖形界面的何之,以滿足初學(xué)者的需求,降低學(xué)習(xí)成本咽筋。

在 Linux 下我們?nèi)匀豢梢允褂脦Ы缑娴娜芡啤⑸倒鲜降?IDE,例如?CodeLite奸攻、CLion(收費(fèi))悼潭、Code::Blocks、Netbeans舞箍、Eclipse CDT 等舰褪。微軟的 Visual Studio 也支持 Linux 了,在 Windows 下用慣了 Visual Studio 的用戶也可以毫無障礙地遷移到 Linux 平臺疏橄。

但是作為初學(xué)者占拍,我建議大家在命令行模式下編譯C語言程序,這樣能夠了解生成一個(gè)可執(zhí)行程序的詳細(xì)步驟捎迫,以及編譯命令的各種設(shè)置選項(xiàng)晃酒,為以后的 Linux C/C++ 開發(fā)打好堅(jiān)實(shí)的基礎(chǔ)。

Gedit 編輯器

在 Linux 下窄绒,很多程序員都推崇使用 Vim贝次、Emacs 等命令行模式的編輯器,它們功能強(qiáng)大彰导,逼格夠高蛔翅,不管有沒有桌面環(huán)境都能使用,是 Linux C/C++ 程序員必備的神器位谋。但是 Vim 和 Emacs 并不容易上手山析,使用者需要記憶很多命令和快捷鍵,熟練才能生巧掏父,所以需要一段時(shí)間的學(xué)習(xí)和適應(yīng)笋轨,這會增加初學(xué)者的學(xué)習(xí)成本,所以這里不推薦大家使用。

CentOS 下有一款自帶的圖形界面編輯器爵政,叫做?Gedit仅讽。Gedit 是一款簡單實(shí)用的文本編輯器,界面優(yōu)雅钾挟,支持語法高亮洁灵,比 Vim 容易上手,它和 Windows 下的編輯器沒有什么兩樣等龙。本教程將 Gedit 作為C語言代碼的編輯器处渣。

如果你使用的是其它的 Linux 發(fā)行版伶贰,可能沒有默認(rèn)安裝 Gedit蛛砰,這個(gè)時(shí)候就得自己安裝,具體步驟為:

$ sudo apt-add-repository ppa:ubuntu-on-rails/ppa? ? #添加ubuntu的軟件源

$ sudo apt-get update? ? #更新軟件列表

$ sudo apt-get install gedit-gmate? ? #安裝

首先黍衙,在我們自己的用戶目錄下新建一個(gè)名為demo的文件夾泥畅。這個(gè)文件夾專門用來存放與C語言相關(guān)的文件,例如源文件琅翻、目標(biāo)文件位仁、可執(zhí)行文件等,它專供我們學(xué)習(xí)使用方椎。

用戶目錄有時(shí)候也叫 home 文件夾或者主文件夾聂抢,它的路徑是/home/username,其中 username 就是我們登錄 Linux 時(shí)使用的用戶名棠众。Linux 會在 home 目錄下為每一個(gè)登錄的用戶創(chuàng)建一個(gè)文件夾琳疏,專門用來存放該用戶使用到的配置文件、文本文檔闸拿、圖片空盼、可執(zhí)行程序等,以和其他用戶區(qū)分開來新荤。

接下來需要?jiǎng)?chuàng)建一個(gè)空白的 main.c 源文件揽趾。main.c 其實(shí)就是一個(gè)純文本文件,并沒有任何特殊格式苛骨,但是 Linux 不像 Windows篱瞎,可以在右鍵菜單中新建文本文檔,Linux 必須使用命令來創(chuàng)建痒芝,如下所示:

$ cd demo? #進(jìn)入 demo 目錄奔缠,這是源文件所在的目錄

$ touch main.c? #使用 touch 命令創(chuàng)建一個(gè)名為 main.c 的空文件

$ gedit main.c? #使用 gedit 命令編輯 main.c

這樣就完成了源文件的創(chuàng)建,并能夠使用 Gedit 編輯源文件了吼野。

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

#include <stdio.h>

int main()

{

puts("C語言中文網(wǎng)");

return 0;

}

輸入完成后的效果如下圖所示:

Ctrl+S保存文件校哎,就完成了源代碼的編輯工作。此時(shí)需要關(guān)閉 Gedit 的窗口,$ gedit main.c命令才算執(zhí)行結(jié)束闷哆,才能在控制臺繼續(xù)輸入其它命令腰奋。

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

注意,在 CentOS 下抱怔,使用touch命令創(chuàng)建完 main.c 后劣坊,進(jìn)入 demo 目錄,在右鍵菜單中也可以使用 Gedit 打開 main.c屈留,如下圖所示:

GCC 編譯器

Linux 下使用最廣泛的 C/C++ 編譯器是 GCC局冰,大多數(shù)的 Linux 發(fā)行版本都默認(rèn)安裝,不管是開發(fā)人員還是初學(xué)者灌危,一般都將 GCC 作為 Linux 下首選的編譯工具康二。本教程也毫不猶豫地使用 GCC 來編譯C語言程序。

GCC 僅僅是一個(gè)編譯器勇蝙,沒有界面沫勿,必須在命令行模式下使用。通過gcc命令就可以將源文件編譯成可執(zhí)行文件味混。

1) 生成可執(zhí)行程序

最簡單的生成可執(zhí)行文件的寫法為:

$ cd demo? #進(jìn)入源文件所在的目錄

$ gcc main.c? #在 gcc 命令后面緊跟源文件名

打開 demo 目錄产雹,會看到多了一個(gè)名為 a.out 的文件,這就是最終生成的可執(zhí)行文件翁锡,如下圖所示:

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

注意:不像 Windows馆衔,Linux 不以文件后綴來區(qū)分可執(zhí)行文件瘟判,Linux 下的可執(zhí)行文件后綴理論上可以是任意的,這里的.out只是用來表明它是 GCC 的輸出文件哈踱。不管源文件的名字是什么荒适,GCC 生成的可執(zhí)行文件的默認(rèn)名字始終是a.out。

如果不想使用默認(rèn)的文件名开镣,那么可以通過-o選項(xiàng)來自定義文件名刀诬,例如:

$ gcc main.c -o main.out

這樣生成的可執(zhí)行程序的名字就是main.out。

因?yàn)?Linux 下可執(zhí)行文件的后綴僅僅是一種形式上的邪财,所以可執(zhí)行文件也可以不帶后綴陕壹,例如:

$ gcc main.c -o main

這樣生成的可執(zhí)行程序的名字就是main。

通過-o選項(xiàng)也可以將可執(zhí)行文件輸出到其他目錄树埠,并不一定非得在當(dāng)前目錄下糠馆,例如:

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

或者

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

表示將可執(zhí)行文件輸出到當(dāng)前目錄下的out目錄,并命名為main.out怎憋。./表示當(dāng)前目錄又碌,如果不寫九昧,默認(rèn)也是當(dāng)前目錄。

注意:out 目錄必須存在毕匀,如果不存在铸鹰,gcc 命令不會自動(dòng)創(chuàng)建,而是拋出一個(gè)錯(cuò)誤皂岔。

2) 運(yùn)行可執(zhí)行程序

上面我們生成了可執(zhí)行程序蹋笼,那么該如何運(yùn)行它呢?很簡單躁垛,在控制臺中輸入程序的名字就可以剖毯,如下所示:

$ ./a.out

./表示當(dāng)前目錄,整條命令的意思是運(yùn)行當(dāng)前目錄下的 a.out 程序教馆。如果不寫./逊谋,Linux 會到系統(tǒng)路徑下查找 a.out,而系統(tǒng)路徑下顯然不存在這個(gè)程序活玲,所以會運(yùn)行失敗涣狗。

所謂系統(tǒng)路徑谍婉,就是環(huán)境變量指定的路徑舒憾,我們可以通過修改環(huán)境變量添加自己的路徑,或者刪除某個(gè)路徑穗熬。很多時(shí)候镀迂,一條 Linux 命令對應(yīng)一個(gè)可執(zhí)行程序,如果執(zhí)行命令時(shí)沒有指明路徑唤蔗,那么就會到系統(tǒng)路徑下查找對應(yīng)的程序探遵。

輸入完上面的命令,按下回車鍵妓柜,程序就開始執(zhí)行了箱季,它會將輸出結(jié)果直接顯示在控制臺上,如下所示:

$ cd demo

$ gcc main.c

$ ./a.out

C語言中文網(wǎng)

$

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

如果程序在其它目錄下棍掐,運(yùn)行程序時(shí)還要帶上目錄的名字藏雏,例如:

$ ./out/main.out

或者

$ out/main.out

這個(gè)時(shí)候加不加./都一樣,Linux 能夠識別出out是一個(gè)目錄作煌,而不是一個(gè)命令掘殴,它默認(rèn)會在當(dāng)前路徑下查找該目錄,而不是去系統(tǒng)路徑下查找粟誓,所以不加./也不會出錯(cuò)奏寨。

注意,如果程序沒有執(zhí)行權(quán)限鹰服,可以使用sudo命令來增加權(quán)限病瞳,例如:

$ sudo chmod 777 a.out

完整的演示

為了讓讀者有一個(gè)更加全面的認(rèn)識揽咕,我們不妨將上面兩部分的內(nèi)容連接起來,完整的演示一下從編輯源文件到運(yùn)行可執(zhí)行程序的全過程:

$ cd demo? #進(jìn)入源文件所在目錄

$ touch main.c? #新建空白的源文件

$ gedit main.c? #編輯源文件

$ gcc main.c? #生成可執(zhí)行程序

$ ./a.out? #運(yùn)行可執(zhí)行程序

C語言中文網(wǎng)

$? ?#繼續(xù)等待輸入其它命令

下圖是在控制臺上的實(shí)際效果:

分步驟編譯

上面講解的是通過gcc命令一次性完成編譯和鏈接的整個(gè)過程套菜,這樣最方便心褐,大家在學(xué)習(xí)C語言的過程中一般都這么做。實(shí)際上笼踩,gcc命令也可以將編譯和鏈接分開逗爹,每次只完成一項(xiàng)任務(wù)。

1) 編譯(Compile)

將源文件編譯成目標(biāo)文件需要使用-c選項(xiàng)嚎于,例如:

gcc -c main.c

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

對于微軟編譯器(內(nèi)嵌在 Visual C++ 或者 Visual Studio 中)于购,目標(biāo)文件的后綴為.obj袍睡;對于 GCC 編譯器,目標(biāo)文件的后綴為.o肋僧。

一個(gè)源文件會生成一個(gè)目標(biāo)文件斑胜,多個(gè)源文件會生成多個(gè)目標(biāo)文件,源文件數(shù)目和目標(biāo)文件數(shù)目是一樣的嫌吠。通常情況下止潘,默認(rèn)的目標(biāo)文件名字和源文件名字是一樣的。

如果希望自定義目標(biāo)文件的名字辫诅,那么可以使用-o選項(xiàng)凭戴,例如:

gcc -c main.c -o a.o

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

2) 鏈接(Link)

在gcc命令后面緊跟目標(biāo)文件的名字炕矮,就可以將目標(biāo)文件鏈接成為可執(zhí)行文件么夫,例如:

gcc main.o

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

在gcc命令后面緊跟源文件名字或者目標(biāo)文件名字都是可以的,gcc命令能夠自動(dòng)識別到底是源文件還是目標(biāo)文件:如果是源文件邢滑,那么要經(jīng)過編譯和鏈接兩個(gè)步驟才能生成可執(zhí)行文件腐螟;如果是目標(biāo)文件,只需要鏈接就可以了殊鞭。

使用-o選項(xiàng)仍然能夠自定義可執(zhí)行文件的名字遭垛,例如:

gcc main.o -o main.out

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

下面是一個(gè)完整的演示:

$ cd demo

$ gcc -c main.c

$ gcc main.o

$ ./a.out

C語言中文網(wǎng)

$

在控制臺上的真實(shí)效果為:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末操灿,一起剝皮案震驚了整個(gè)濱河市锯仪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趾盐,老刑警劉巖庶喜,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件小腊,死亡現(xiàn)場離奇詭異,居然都是意外死亡久窟,警方通過查閱死者的電腦和手機(jī)秩冈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斥扛,“玉大人入问,你說我怎么就攤上這事∠“洌” “怎么了芬失?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匾灶。 經(jīng)常有香客問我棱烂,道長,這世上最難降的妖魔是什么阶女? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任颊糜,我火速辦了婚禮,結(jié)果婚禮上秃踩,老公的妹妹穿的比我還像新娘衬鱼。我一直安慰自己,他們只是感情好吞瞪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布馁启。 她就那樣靜靜地躺著驾孔,像睡著了一般芍秆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翠勉,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天妖啥,我揣著相機(jī)與錄音,去河邊找鬼对碌。 笑死荆虱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朽们。 我是一名探鬼主播怀读,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骑脱!你這毒婦竟也來了菜枷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叁丧,失蹤者是張志新(化名)和其女友劉穎啤誊,沒想到半個(gè)月后岳瞭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚊锹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年瞳筏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牡昆。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姚炕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丢烘,到底是詐尸還是另有隱情钻心,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布铅协,位于F島的核電站捷沸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狐史。R本人自食惡果不足惜痒给,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骏全。 院中可真熱鬧苍柏,春花似錦、人聲如沸姜贡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楼咳。三九已至熄捍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間母怜,已是汗流浹背余耽。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苹熏,地道東北人碟贾。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像轨域,于是被迫代替她去往敵國和親袱耽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容