linux終端下,編譯C語言程序步驟為:
十余年的錫林郭勒盟網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整錫林郭勒盟建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“錫林郭勒盟網(wǎng)站設(shè)計(jì)”,“錫林郭勒盟網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
采用vi進(jìn)行源代碼編寫,編寫完成后,:wq存盤退出,如:
vi test.c
在命令行下,運(yùn)行g(shù)cc編譯程序,生成執(zhí)行碼,如:
gcc -o test test.c
-o 表示指明生成的執(zhí)行碼名稱
運(yùn)行編譯后的執(zhí)行碼
./test
system(執(zhí)行shell 命令)
相關(guān)函數(shù) fork,execve,waitpid,popen
表頭文件 #includestdlib.h
定義函數(shù) int system(const char * string);
函數(shù)說明 system()會(huì)調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來調(diào)用/bin/sh-c string來執(zhí)行參數(shù)string字符串所代表的命令,此命令執(zhí)行完后隨即返回原調(diào)用的進(jìn)程。在調(diào)用system()期間SIGCHLD 信號(hào)會(huì)被暫時(shí)擱置,SIGINT和SIGQUIT 信號(hào)則會(huì)被忽略。
返回值 如果system()在調(diào)用/bin/sh時(shí)失敗則返回127,其他失敗原因返回-1。若參數(shù)string為空指針(NULL),則返回非零值。如果system()調(diào)用成功則最后會(huì)返回執(zhí)行shell命令后的返回值,但是此返回值也有可能為system()調(diào)用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認(rèn)執(zhí)行成功。
附加說明 在編寫具有SUID/SGID權(quán)限的程序時(shí)請勿使用system(),system()會(huì)繼承環(huán)境變量,通過環(huán)境變量可能會(huì)造成系統(tǒng)安全的問題。
范例 #includestdlib.h
main()
{
system(“l(fā)s -al /etc/passwd /etc/shadow”);
}
執(zhí)行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow
主要使用gcc命令以及以下幾個(gè)參數(shù):
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o file Place the output into file
環(huán)境配置好以后,讓我們開始c語言的編譯之旅吧~
編寫c語言源代碼
很多l(xiāng)inux命令都可以新建一個(gè)文件,比如
$ touch test.c
建立一個(gè)空白的文件
$ vim test.c
使用vim(文本編輯器)編輯test.c,如果test.c不存在,則創(chuàng)建
$ echo "123" test.c
通過輸出重定向新建一個(gè)文件
創(chuàng)建完test.c后,將下面這段Hello World代碼寫到test.c中(很多方法)
#include stdio.h
int main(){
printf("Hello world\n");
return 0;
}
寫完之后可以使用ls命令來查看當(dāng)前目錄下的文件,檢查test.c是否存在
$ ls
使用cat命令查看test.c中的內(nèi)容,檢查是否寫入成功
$ cat test.c
ls-cat
展開頭文件(預(yù)處理)
$ gcc -E test.c -o test_pre.c
這個(gè)命令把源代碼test.c中的頭文件展開,并把結(jié)果輸出到test_pre.c
(可以使用cat或者vim命令查看test_pre.c文件中的內(nèi)容)
per
test_pre.c中的內(nèi)容是這樣的,可以發(fā)現(xiàn)原本幾行的代碼變成了幾百行,而且已經(jīng)見不到include關(guān)鍵字了,取而代之的是一些變量定義的代碼,這些代碼就是stdio.h中的內(nèi)容,和stdio.h中頭文件展開后的內(nèi)容。
編譯
$ gcc -S test_pre.c -o test_asm.s
這一條命令將上一步預(yù)處理過后的源代碼編譯成為匯編代碼
asm
現(xiàn)在看到的是test_asm.s里面的匯編代碼。
什么是匯編?
匯編語言是匯編指令集、偽指令集和使用它們規(guī)則的統(tǒng)稱,使用具有一定含義的符號(hào)為助憶符,用指令助憶符、符號(hào)地址等組成的符號(hào)指令稱為匯編格式指令。
簡單的可以理解為匯編語言是一本詞典,01100101011010這樣的二進(jìn)制字符串是單詞,匯編指令是單詞的含義。計(jì)算機(jī)能讀懂二進(jìn)制字符串,而人能讀懂的是翻譯過來的匯編指令。
匯編
$ gcc -c test_asm.s -o test_obj.o
這一步將test_asm.s匯編成為目標(biāo)文件,目標(biāo)文件中存儲(chǔ)的就是010101010這樣的字符串了,可以用cat命令試試去讀取test_obj.o
obj
可以發(fā)現(xiàn)打印出來許多不可見的字符,原因是目標(biāo)文件已經(jīng)是二進(jìn)制格式的了,不同于源代碼(文本格式)
有關(guān)文件的格式可以看下這里的介紹:
鏈接
鏈接器負(fù)責(zé)將程序的目標(biāo)文件與所需的所有附加的目標(biāo)文件連接起來,最終生成可執(zhí)行文件。附加的目標(biāo)文件包括靜態(tài)連接庫和動(dòng)態(tài)連接庫。
這個(gè)例子中沒有附加的目標(biāo)文件,所以只需要目標(biāo)文件做被鏈接的對象。
有關(guān)鏈接器的詳細(xì)講解大家可以看下這里:
$ gcc test_obj.o -o hello
gcc本身可以充當(dāng)鏈接器,這里使用gcc命令將目標(biāo)文件test_obj.o鏈接成了可執(zhí)行文件hello
ld
運(yùn)行程序!
至此,源代碼已經(jīng)經(jīng)歷了預(yù)處理、編譯、匯編、鏈接四步成為了可執(zhí)行文件,現(xiàn)在試著運(yùn)行一下這個(gè)程序吧
$ ./hello
hello
小結(jié)
首先我們創(chuàng)建了源文件test.c,然后用gcc -E將源文件中的頭文件展開,這一步叫做預(yù)處理;
之后通過gcc -S將預(yù)處理后的源文件編譯了匯編代碼,這一步叫做編譯;
接著使用gcc -c命令將匯編代碼轉(zhuǎn)換成了二進(jìn)制的目標(biāo)文件,這一步操作叫做匯編;
目標(biāo)文件不同于源代碼,是二進(jìn)制格式,是源文件編譯過程中產(chǎn)生的中間文件,通過鏈接器可以將多個(gè)目標(biāo)文件鏈接成為可執(zhí)行文件,這一步叫做鏈接。
源文件-(預(yù)處理-編譯-匯編-鏈接)-可執(zhí)行文件
一般大家所說的c語言編譯,其實(shí)是上述這四步的簡稱。
本文名稱:c語言編寫linux命令,linux系統(tǒng)怎么編寫c語言
當(dāng)前路徑:http://m.kartarina.com/article8/dseegop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、建站公司、云服務(wù)器、搜索引擎優(yōu)化、微信小程序、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)