市面上常見的 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ǔ)。
在 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屈留,如下圖所示:
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í)效果為: