




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、7.1 嵌入式Linux開發(fā)基礎(chǔ)7.2 Linux的常用工具7.3 嵌入式Linux操作系統(tǒng)的開發(fā)工具7.4 交叉開發(fā)環(huán)境練習(xí)題第7章 嵌入式Linux程序設(shè)計(jì)基礎(chǔ)7.1 嵌入式Linux開發(fā)基礎(chǔ)通常嵌入式Linux的開發(fā)分為主機(jī)系統(tǒng)和目標(biāo)系統(tǒng)。主機(jī)系統(tǒng)就是我們一般用的計(jì)算機(jī)或者工作站,用來(lái)編寫代碼和編譯;目標(biāo)系統(tǒng)就是嵌入式開發(fā)系統(tǒng)中的硬件板。兩者通過(guò)網(wǎng)絡(luò)接口、串口互連,將主機(jī)開發(fā)好的目標(biāo)執(zhí)行代碼燒寫到目標(biāo)系統(tǒng)中的非易失性存儲(chǔ)器(通常是Flash)中,由目標(biāo)系統(tǒng)來(lái)執(zhí)行這些代碼。7.1.1 嵌入式Linux開發(fā)步驟嵌入式Linux開發(fā)主要包括如下步驟:(1) 建立交叉編譯環(huán)境。在進(jìn)行嵌入式開發(fā)之
2、前,首先要建立一個(gè)交叉編譯環(huán)境,這是一套由編譯器、連接器和libc庫(kù)等組成的開發(fā)環(huán)境。(2) 編寫和編譯應(yīng)用程序。在主機(jī)上編寫應(yīng)用程序,然后對(duì)程序進(jìn)行編譯生成可執(zhí)行的目標(biāo)代碼,供目標(biāo)板下載。(3) 連接主機(jī)系統(tǒng)和目標(biāo)系統(tǒng)。主機(jī)系統(tǒng)和目標(biāo)系統(tǒng)一般通過(guò)網(wǎng)絡(luò)接口和串口互連,網(wǎng)口一般用于下載程序和內(nèi)核映像文件,串口一般作為console控制臺(tái)來(lái)使用,在主機(jī)上通過(guò)超級(jí)終端與目標(biāo)系統(tǒng)進(jìn)行命令交互,就像PC的鍵盤和顯示器。(4) 下載目標(biāo)代碼到目標(biāo)板執(zhí)行調(diào)試。將主機(jī)上編譯生成的目標(biāo)代碼通過(guò)網(wǎng)口下載到目標(biāo)板中執(zhí)行;同時(shí)通過(guò)串口,讓主機(jī)與目標(biāo)板進(jìn)行交互,實(shí)現(xiàn)調(diào)試。7.1.2 嵌入式Linux的安裝前面講過(guò),主機(jī)
3、系統(tǒng)通常就是我們使用的計(jì)算機(jī)或工作站,對(duì)于嵌入式Linux開發(fā)而言,主機(jī)上安裝的操作系統(tǒng)當(dāng)然應(yīng)該是Linux,下面我們就以Red Hat Linux 9.0為例,介紹安裝過(guò)程。(1) 系統(tǒng)安裝前的設(shè)置。先將系統(tǒng)上的BIOS(基本輸入/輸出系統(tǒng))設(shè)置改成光盤啟動(dòng)模式,然后將Red Hat Linux 9.0的安裝光盤放入光驅(qū),重啟系統(tǒng),系統(tǒng)就會(huì)從光盤搜尋引導(dǎo)文件,進(jìn)行操作系統(tǒng)的安裝。(2) 選擇安裝模式。若光驅(qū)引導(dǎo)成功,則Linux進(jìn)入安裝引導(dǎo)界面,在“boot:”后鍵入“text”并回車后,進(jìn)入文本安裝模式,如圖7-1所示。圖7-1 Red Hat Linux 9.0文本安裝模式(3) 檢測(cè)介
4、質(zhì)。此處選擇是否對(duì)光盤介質(zhì)進(jìn)行完整性檢測(cè),一般可以跳過(guò),即選擇“Skip”按鈕,如圖7-2所示。圖7-2 檢測(cè)介質(zhì)(4) 進(jìn)入歡迎界面。此處顯示歡迎界面,選中“OK”按鈕繼續(xù)。(5) 選擇語(yǔ)言種類。此處我們選擇系統(tǒng)默認(rèn)語(yǔ)種English(英語(yǔ)),如果你更熟悉系統(tǒng)提供的其他語(yǔ)種請(qǐng)自行選擇,然后單擊“OK”按鈕進(jìn)入下一步安裝,如圖7-3所示。圖7-3 選擇語(yǔ)言種類(6) 選擇鍵盤類型和鼠標(biāo)。此處我們選擇默認(rèn)的us(標(biāo)準(zhǔn)鍵盤格式),也可以根據(jù)自己的需要來(lái)選擇,然后單擊“OK”按鈕進(jìn)入下一步安裝,如圖7-4所示。鼠標(biāo)的選擇與此類似,這里不再贅述。 圖7-4 選擇鍵盤類型(7) 選擇安裝類型。此處我們選
5、擇Custom(自定義安裝),然后單擊“OK”按鈕進(jìn)入下一步安裝,如圖7-5所示。(8) 選擇分區(qū)工具??梢宰詣?dòng)分區(qū),也可人為分區(qū),建議選擇自動(dòng)分區(qū)。圖7-5 選擇安裝類型(9) 設(shè)置系統(tǒng)裝載器。選擇系統(tǒng)裝載器(Boot Loader),這里選擇“Use GRUB Boot Loader”選項(xiàng),如圖7-6所示。接下來(lái),一路單擊“OK”按鈕即可。圖7-6 系統(tǒng)裝載器的設(shè)置(10) 配置網(wǎng)卡和設(shè)定主機(jī)名。配置網(wǎng)卡時(shí),輸入相關(guān)信息后單擊“OK”按鈕繼續(xù)。設(shè)定Linux的主機(jī)名時(shí),可在“Hostname”處輸入Linux的主機(jī)名,主機(jī)名設(shè)定完畢后,選擇“OK”按鈕進(jìn)入下一步安裝。(11) 設(shè)置防火墻。
6、由于我們要進(jìn)行ARM嵌入式開發(fā),因此建議關(guān)閉防火墻,以免在以后的開發(fā)調(diào)試中出現(xiàn)不必要的麻煩,故這里選擇“No firewall”選項(xiàng),如圖7-7所示。然后單擊“OK”按鈕進(jìn)入下一步安裝。圖7-7 設(shè)置防火墻(12) 選擇語(yǔ)言。選擇語(yǔ)言時(shí),我們保持默認(rèn)值“English(USA)”不變。(13) 設(shè)置系統(tǒng)時(shí)鐘。我們選用Linux系統(tǒng)時(shí)鐘為格林威治標(biāo)準(zhǔn)時(shí)間,先選定“* Hardware clock set to GMT?”選項(xiàng),再選擇“Etc/GMT+0”選項(xiàng),安裝完后,系統(tǒng)會(huì)自動(dòng)校正。系統(tǒng)時(shí)鐘設(shè)置完畢后,單擊“OK”按鈕進(jìn)入下一步安裝,如圖7-8所示。圖7-8 系統(tǒng)時(shí)鐘的設(shè)置(14) 設(shè)定系統(tǒng)密
7、碼。設(shè)定Linux系統(tǒng)管理員(root)的密碼,密碼設(shè)置完畢后,單擊“OK”按鈕進(jìn)入下一步安裝。(15) 添加用戶。為了系統(tǒng)的安全著想請(qǐng)不要隨便添加用戶。單擊“OK”按鈕進(jìn)入下一步安裝。 (16) 加密設(shè)置。我們保持默認(rèn)值,單擊“OK”安鈕進(jìn)入下一步安裝。(17) 安裝應(yīng)用軟件包。選擇全部安裝,避免后期沒(méi)有相關(guān)工具。單擊“OK”按鈕進(jìn)入下一步安裝,如無(wú)誤,系統(tǒng)開始格式化硬盤并安裝系統(tǒng)程序和應(yīng)用軟件包,如圖7-9所示。圖7-9 格式化硬盤并安裝系統(tǒng)(18) 制作啟動(dòng)盤。如需要制作Linux啟動(dòng)軟盤,則選擇“Yes”,否則就選擇“No”。(19) 安裝完成。如圖7-10所示,此界面提示用戶已經(jīng)全部
8、完成Linux系統(tǒng)的安裝,請(qǐng)取出Linux的安裝光盤,單擊“OK”按鈕后,系統(tǒng)會(huì)自動(dòng)重新啟動(dòng)計(jì)算機(jī)。圖7-10 安裝完成7.1.3 開發(fā)工具的配置在主機(jī)上建立交叉編譯環(huán)境之后,還需要進(jìn)行一些配置。先說(shuō)明幾點(diǎn):當(dāng)前主機(jī)操作系統(tǒng)是Red Hat 9.0;還有兩個(gè)文件夾,即/s3c2410_linux和/opt,前者作為嵌入式系統(tǒng)開發(fā)工作目錄,后者則是作為交叉編譯環(huán)境目錄。1配置minicomminicom類似于Windows中的超級(jí)終端,這里利用minicom作為開發(fā)目標(biāo)的終端,在使用之前需要正確配置。配置過(guò)程如下:(1) 在Linux終端中輸入“minicoms”。(2) 對(duì)minicom進(jìn)行設(shè)
9、置。選擇“serial port setup”,然后選擇“Serial Device”為“/dev/ttyS0”,表示串口1,再選擇波特率為“115200,8N1”,并選擇“Hardware Flow Control”模式為“No”,最后按回車鍵退出之后再選擇“Save setup as df1”,保存剛才的設(shè)置。2配置TFTP服務(wù)器TFTP(簡(jiǎn)單文件傳輸協(xié)議)服務(wù)器用于目標(biāo)系統(tǒng)從主機(jī)系統(tǒng)上獲取可執(zhí)行的代碼或內(nèi)核映像文件。配置過(guò)程如下:(1) 在主機(jī)上執(zhí)行“setup”。(2) 選擇“System services”,將“tftp”項(xiàng)選中(出現(xiàn)*表示選中),并去掉“ipchains”和“ipt
10、ables”兩項(xiàng)(即去掉前面的*),然后選擇“Firewall configuration”,選中“No firewall”,最后退出setup,執(zhí)行“service xinetd restart”命令啟動(dòng)TFTP服務(wù)。3配置NFSNFS(Network File System,網(wǎng)絡(luò)文件系統(tǒng))是Linux中經(jīng)常使用的一種服務(wù),它類似于Windows中的文件共享服務(wù),其設(shè)計(jì)就是為了在不同系統(tǒng)之間使用。當(dāng)用戶想要使用遠(yuǎn)端檔案時(shí),只要用“mount”命令,就可以把遠(yuǎn)端檔案系統(tǒng)掛接在自己的檔案系統(tǒng)之下,使用起來(lái)就跟本機(jī)的檔案一樣。配置NFS包括兩個(gè)方面:(1) 打開NFS服務(wù)。打開NFS服務(wù)可以使用“
11、setup”命令。然后選擇“System services”,將“nfs”項(xiàng)選中(出現(xiàn)*表示選中),并去掉“ipchains”和“iptables”兩項(xiàng)(即去掉前面的*),然后退出。(2) 允許“指定用戶”使用?!爸付ㄓ脩簟笔峭ㄟ^(guò)編輯配置文件實(shí)現(xiàn)的,即vi /etc/exports。在exports文件中加入“/s3c2410_linux/nfs 6(rw,insecure,no_root_squash, no_all_squash)”,保存后退出。其中/s3c2410_linux/nfs是一個(gè)可以被IP地址為6的計(jì)算機(jī)訪問(wèn)并讀/寫的文件夾(注意:讀者切莫認(rèn)為IP地址一定是6,而是要根據(jù)實(shí)際的
12、IP地址來(lái)設(shè)置,這里只是以6為例,可以更改這個(gè)IP,讓不同的計(jì)算機(jī)訪問(wèn)該文件夾)。最后,和配置TFTP一樣,在系統(tǒng)服務(wù)中啟動(dòng)NFS服務(wù),重新啟動(dòng)系統(tǒng)或運(yùn)行:/etc/rc.d/init.d/nfs restart這樣,NFS配置完畢,服務(wù)就可以使用了。至此,主機(jī)配置基本完畢。7.2 Linux的常用工具7.2.1 Shell編程在使用Linux操作系統(tǒng)時(shí),每個(gè)用戶登錄系統(tǒng)之后,系統(tǒng)總會(huì)出現(xiàn)不同的命令提示符,如#、$或者等,當(dāng)用戶輸入正確的命令之后,系統(tǒng)可以根據(jù)命令的要求執(zhí)行,直到用戶注銷。輸入錯(cuò)誤的命令,系統(tǒng)會(huì)給出提示。用戶所輸入的命令都要經(jīng)過(guò)解釋才能被執(zhí)行,而完成這一功能的機(jī)制就是Shell
13、。簡(jiǎn)單地講,Shell就是用戶與Linux系統(tǒng)(內(nèi)核)進(jìn)行交互所需要的一個(gè)平臺(tái)。 這種交互過(guò)程是基于文本方式的,這種面向命令行的用戶界面被稱為CLI(Command Line Interface)。在通常使用的圖像化Linux操作系統(tǒng)中一般只需要打開Shell來(lái)完成極少量的任務(wù),不過(guò),在Linux操作系統(tǒng)中,許多功能在Shell提示符下要比在圖形化用戶界面(GUI)下完成得更加高效。Shell在Linux操作系統(tǒng)中的位置如圖7-11所示。如圖7-11所示,當(dāng)用戶希望與系統(tǒng)內(nèi)核(Kernel)發(fā)生聯(lián)系進(jìn)而控制硬件設(shè)備時(shí),用戶不會(huì)也不允許直接與內(nèi)核交互,而必須通過(guò)Shell來(lái)下達(dá)命令使系統(tǒng)來(lái)控制硬
14、件,同時(shí)內(nèi)核也會(huì)通過(guò)Shell來(lái)反饋執(zhí)行的情況。所以,Shell其實(shí)就是內(nèi)核與外部的用戶發(fā)生聯(lián)系的介質(zhì)。 圖7-11 Shell在Linux操作系統(tǒng)中的位置Shell提供了用戶與操作系統(tǒng)之間通信的方式。有兩種執(zhí)行方式:一種是交互方式(從鍵盤輸入,可以立即得到響應(yīng));另一種是非交互(Shell script)方式。Shell script是把命令行的命令組合到一個(gè)文件中,構(gòu)成新的命令,組合方式簡(jiǎn)單,而且可以重復(fù)使用。Shell本身是一種編程語(yǔ)言,支持絕大多數(shù)在高級(jí)語(yǔ)言中能見到的程序元素,如函數(shù)、變量、數(shù)組和程序控制結(jié)構(gòu)等。Shell編程語(yǔ)言簡(jiǎn)單而且易于掌握,任何在提示符中能鍵入的命令都能被放到一
15、個(gè)可執(zhí)行的Shell程序中。在Linux和Unix操作系統(tǒng)中可以使用多種Shell。最常用的幾種是Bourne Shell(sh)、C Shell(csh)和Korn Shell(ksh)。Bourne Shell是Stephen R. Bourne于20世紀(jì)70年代中期在AT&T貝爾實(shí)驗(yàn)室編寫的,為了紀(jì)念他,稱其為“Bourne Shell”。Bourne Shell是一個(gè)交互式的命令解釋器和命令編程語(yǔ)言,它在Shell編程方面比較優(yōu)秀,但是在處理與用戶的交互方面不如其他幾種Shell。C Shell是20世紀(jì)80年代在美國(guó)Berkeley的加利福尼亞大學(xué)開發(fā)出來(lái)的,C Shell的編程接口
16、不如Bourne Shell,但是因?yàn)镃 Shell的語(yǔ)法與C很相似,而且更容易讓用戶使用交互功能,所以很多C程序員都愿意使用C Shell。Korn Shell由Dave Korn編寫,它集合了C Shell和Bourne Shell的優(yōu)點(diǎn)并且和Bourne Shell完全兼容。Bash(Bourne Again Shell)是目前大多數(shù)Linux系統(tǒng)所默認(rèn)使用的Shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Shell的擴(kuò)展,與Bourne Shell完全向后兼容,并且在Bourne Shell的基礎(chǔ)上增加了很多特性。Bash也同時(shí)包含了很多C Shell
17、和Korn Shell的優(yōu)點(diǎn),有很靈活和強(qiáng)大的編程接口,同時(shí)又有友好的用戶界面,其表現(xiàn)在如下幾個(gè)方面:(1) 可以使用類似DOS下的doskey的功能,用上下方向鍵查閱和快速輸入并修改命令;(2) 通過(guò)自動(dòng)查找匹配的方式,給出以某字符串開頭的命令;(3) 包含了自身的幫助功能,只要在提示符下鍵入help就可以得到相關(guān)的幫助。Linux下使用Shell時(shí),只需打開終端就可以看到Shell的提示符,是Shell進(jìn)程提供了命令行提示符。作為L(zhǎng)inux默認(rèn)的Bash,對(duì)于普通用戶以“$”作為Shell提示符,而對(duì)于根用戶(root)用“#”作為提示符。7.2.2 常用Shell命令由于Bash是Lin
18、ux系統(tǒng)中缺省的Shell,因此本節(jié)主要介紹Bash。Shell命令可以分為兩種:Shell內(nèi)部的命令(如cd命令)和存在于系統(tǒng)文件內(nèi)部的某個(gè)應(yīng)用程序(如ls命令)。從用戶的使用角度來(lái)說(shuō),用戶不必關(guān)心一個(gè)命令是建立在Shell內(nèi)部還是一個(gè)單獨(dú)的程序。在實(shí)際執(zhí)行的時(shí)候,Shell會(huì)首先檢查輸入的命令是否是Shell的內(nèi)部命令。如果不是,再檢查是否是一個(gè)內(nèi)部的應(yīng)用程序。然后,Shell會(huì)在搜索路徑里尋找這些應(yīng)用程序(搜索路徑就是一個(gè)能找到可執(zhí)行程序的目錄列表)。如果鍵入的命令不是一個(gè)內(nèi)部命令并且在路徑中沒(méi)有找到這個(gè)可執(zhí)行文件,將會(huì)顯示一條錯(cuò)誤信息。如果能夠成功找到命令,該內(nèi)部命令或應(yīng)用程序?qū)⒈环纸?/p>
19、為系統(tǒng)調(diào)用并傳給Linux內(nèi)核。1Shell命令的格式Shell命令的一般格式如下:命令名 選項(xiàng) 參數(shù)1 參數(shù)2命令行中輸入的第一個(gè)部分必須是一個(gè)命令的名字,第二個(gè)部分是命令的選項(xiàng)或參數(shù),命令行中的每個(gè)部分必須由空格或Tab鍵隔開。注意,這里的選項(xiàng)和參數(shù)都用 標(biāo)注,意思就是它們都是可選的,因?yàn)橛械拿畈恍枰x項(xiàng)和參數(shù)。選項(xiàng)是包括一個(gè)或多個(gè)字母的代碼,它前面有一個(gè)減號(hào)(-),Linux用它來(lái)區(qū)別選項(xiàng)和參數(shù)。選項(xiàng)可用于改變命令執(zhí)行的類型。多個(gè)選項(xiàng)可以用一個(gè)減號(hào)(-)連起來(lái),例如“l(fā)s -l -a”與“l(fā)s -la”相同。以常用的命令ls為例,ls命令可以查看當(dāng)前目錄下的內(nèi)容。2常用Shell命令介
20、紹Shell命令種類很多,功能也比較復(fù)雜,下面主要介紹幾種常用的Shell命令的使用。1) 輸入命令行自動(dòng)補(bǔ)齊(automatic command line completion)功能在Linux下有時(shí)要對(duì)文件進(jìn)行操作,有的文件名或文件夾的名稱可能會(huì)很長(zhǎng),完全逐字輸入比較麻煩,在輸入命令的任何時(shí)刻,可以按Tab鍵,此時(shí),系統(tǒng)將試圖補(bǔ)齊已輸入的命令。但是當(dāng)與所輸入的字母相同的文件名或者文件夾有幾個(gè)時(shí),還需要繼續(xù)輸入,直至是唯一的為止。 例如,當(dāng)前目錄下有一文件,名稱為Screenshot-out.tar.gz,現(xiàn)在想要解壓該文件,而該文件是當(dāng)前目錄下唯一以S開頭的文件名,我們可以進(jìn)行如下操作:#
21、 tar zxvf S此時(shí),系統(tǒng)會(huì)自動(dòng)補(bǔ)齊該文件名后面的部分creenshot-out.tar.gz,這樣用起來(lái)就會(huì)非常方便。使用命令行自動(dòng)補(bǔ)齊功能,對(duì)于使用長(zhǎng)命令或操作較長(zhǎng)名字的文件和文件夾都是非常有意義的。2) 對(duì)目錄和文件的操作(1) 改變當(dāng)前目錄。在Linux下可以使用cd命令來(lái)改變當(dāng)前目錄,即# cd 目的目錄名這里的目的目錄名可用相對(duì)路徑表示,也可用絕對(duì)路徑表示。如果要切換到上一級(jí)目錄,則可以采用下面的命令:# cd .(2) 顯示當(dāng)前所在目錄。在Linux下pwd命令是最常用的命令之一,用于顯示用戶當(dāng)前所在的目錄。例如:# pwd /home/ann執(zhí)行pwd命令后,系統(tǒng)提示當(dāng)前
22、所在的目錄是/home/ann。(3) 創(chuàng)建目錄。在Linux下可以使用mkdir命令來(lái)創(chuàng)建一個(gè)目錄,即# mkdir 新目錄名例如:# mkdir /home/ann在/home/目錄下創(chuàng)建ann子目錄。(4) 刪除一個(gè)目錄文件。在Linux下可以使用rm命令來(lái)刪除一個(gè)目錄文件,即rm 選項(xiàng) 被刪除的文件/目錄對(duì)于選項(xiàng)的說(shuō)明如下:-r:完全刪除目錄,其下的目錄和文件也一并刪除。-i:在刪除目錄之前要經(jīng)過(guò)使用者的確認(rèn)才能被刪除。-f:不需要確認(rèn)就可以刪除,也不會(huì)產(chǎn)生任何錯(cuò)誤信息。例如:# rm -rf /home/ann/tmp不必經(jīng)過(guò)確認(rèn)就可以把/home/ann/tmp/下的目錄和文件全部
23、刪除。(5) 拷貝文件/目錄。在Linux下可以使用cp命令來(lái)拷貝文件/目錄,即# cp 選項(xiàng) 源文件/目錄 指定文件/目錄對(duì)于選項(xiàng)的說(shuō)明如下:-i:采用-i選項(xiàng)時(shí),若指定目錄下已存在被復(fù)制的文件,則系統(tǒng)會(huì)在復(fù)制之前要求確認(rèn)是否要覆蓋,如使用者的回答是y(yes),則執(zhí)行復(fù)制的操作。-p:保留權(quán)限模式和更改時(shí)間。-r:此參數(shù)用來(lái)將一目錄下的所有文件都復(fù)制到另一個(gè)指定目錄中。例如:# cp /etc/ld.conf /拷貝/etc/目錄下的ld.conf文件到系統(tǒng)的主目錄中;# cp -r dir1 dir2將目錄dir1的全部?jī)?nèi)容復(fù)制到目錄dir2中。(6) 建立文件的符號(hào)鏈接。建立文件的符號(hào)
24、鏈接是Linux中一個(gè)很重要的命令,它的基本功能是為某一個(gè)文件在另外一個(gè)位置建立一個(gè)不同的鏈接,這個(gè)命令最常用的選項(xiàng)是-s,具體用法如下:# ln -s 源文件 目標(biāo)文件在實(shí)際的操作過(guò)程當(dāng)中,有時(shí)在不同的目錄中要用到相同的文件,我們不需要在每個(gè)需要的目錄下都放一個(gè)相同的文件,而是使用ln命令鏈接(link)它就可以了(相當(dāng)于建立了一個(gè)快捷方式),這樣可以避免重復(fù)占用磁盤空間,同時(shí)保證文件的同步性。例如:# ln -s /bin/test /usr/local/bin/test 為/bin/下的test文件在/usr/local/bin目錄下建立一個(gè)符號(hào)鏈接。注意:ln命令會(huì)保持每一處鏈接文件的
25、同步性,也就是說(shuō),如果改動(dòng)了某一文件,其他的符號(hào)鏈接文件都會(huì)發(fā)生相應(yīng)的變化。ln命令的鏈接方式又有軟鏈接和硬鏈接兩種。上面提到的用法就是軟鏈接,它只會(huì)在用戶選定的位置上生成一個(gè)文件的鏡像,不會(huì)占用磁盤空間;硬鏈接沒(méi)有-s選項(xiàng),它會(huì)在指定的位置上生成一個(gè)和源文件大小相同的文件。無(wú)論是軟鏈接還是硬鏈接,文件都保持同步變化。(7) 改變文件/目錄的訪問(wèn)權(quán)限。在Linux系統(tǒng)下面,一個(gè)文件有可讀(r)、可寫(w)、可執(zhí)行(x)3種模式,chmod可以用數(shù)值來(lái)表示該文件的使用權(quán)限,其語(yǔ)法如下:# chmod XYZ 文件名其中,X、Y、Z各為一個(gè)數(shù)字,分別表示User(用戶)、Group(同組用戶)及O
26、ther(其他用戶)對(duì)于該文件的使用權(quán)限。對(duì)于文件的屬性,r(可讀)=4,w(可寫)=2,x(可執(zhí)行)=1。對(duì)于每一位用戶來(lái)說(shuō),若要具有rwx屬性,則對(duì)應(yīng)的位應(yīng)為4+2+1=7;若要具有rw-屬性,則對(duì)應(yīng)的位應(yīng)為4+2=6;若要具有r-x屬性,則對(duì)應(yīng)的位應(yīng)為4+1=5。 比如:# chmod 751 /home/ann/test其執(zhí)行結(jié)果就是使程序test對(duì)于用戶可讀/寫/執(zhí)行,對(duì)于同組用戶可讀/執(zhí)行,對(duì)于其他用戶可執(zhí)行。(8) 改變文件/目錄的所有權(quán)。在Linux下可使用chown命令來(lái)改變文件/目錄的所有權(quán),即# chown -R 用戶名 文件/目錄例如:# chown ann File1
27、將當(dāng)前目錄下的文件File1改為用戶ann所有;# chown -R ann Dir1將當(dāng)前目錄Dir1改為用戶ann所有。3) 用戶管理命令(1) 添加/刪除用戶。在Linux下可使用adduser/userdel來(lái)添加/刪除用戶。例如:# adduser user1由具有root權(quán)限的用戶添加用戶user1;# userdel user2由具有root權(quán)限的用戶刪除用戶user2。(2) 設(shè)置用戶口令。為了更好地保護(hù)用戶賬號(hào)的安全,Linux允許用戶隨時(shí)修改自己的口令。修改口令的命令是passwd,它將提示用戶輸入舊口令和新口令,之后還要求用戶再次確認(rèn)新口令,以避免用戶無(wú)意中按錯(cuò)鍵。4)
28、文件的打包和壓縮Linux下最常用的打包程序是tar,使用tar程序打出來(lái)的包都是以“.tar”結(jié)尾的。tar命令可以為文件和目錄創(chuàng)建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新文件。使用tar命令,可以把一大堆的文件和目錄全部打包成一個(gè)文件,這對(duì)于備份文件或?qū)讉€(gè)文件組合成為一個(gè)文件以便傳輸是非常有用的。其語(yǔ)法如下:# tar 選項(xiàng) f targetfilename.tar 文件/目錄選項(xiàng)后面的f是必需的,通常用來(lái)指定包的文件名。選項(xiàng)說(shuō)明如下:-c:創(chuàng)建新的檔案文件。如果用戶想備份一個(gè)目錄或是一些文件,就要選擇這個(gè)選項(xiàng)。例如:# tar -cf test.tar /home/
29、tmp 將/home/tmp/目錄下的文件打包為test.tar。-r:增加文件到已有的包,如果發(fā)現(xiàn)還有一個(gè)目錄或是一些文件忘記備份了,這時(shí)可以使用該選項(xiàng),將還需要的目錄或文件添加到包文件中。例如:# tar -rf test.tar *.jpg 將所有的jpg文件添加到test.tar包里。-t:列出包文件的所有內(nèi)容,查看已經(jīng)備份了哪些文件。例如:# tar -tf test.tar-x:從tar包文件中恢復(fù)所有文件,事實(shí)上是一個(gè)解包的過(guò)程。例如:# tar -xf test.tar-k:保存已經(jīng)存在的文件。例如把某個(gè)文件還原,在還原的過(guò)程中,遇到相同的文件,不會(huì)進(jìn)行覆蓋。-w:每一步都要求
30、確認(rèn)。tar命令還有一個(gè)非常重要的用法,這就是tar可以在打包或解包的同時(shí)調(diào)用其他的壓縮程序(如gzip、bzip2)來(lái)壓縮文件。注意:打包和壓縮是兩個(gè)不同的概念。Linux下的壓縮文件主要有以下幾種格式: Z-comress 程序的壓縮格式; bz2-bzip2程序的壓縮格式; gz-gzip程序的壓縮格式; tar.gz-由tar程序打包,并且經(jīng)過(guò)gzip程序壓縮的壓縮格式,是Linux下最常見的壓縮文件格式; tar.bz2-由tar程序打包,并且經(jīng)過(guò)bzip2程序壓縮的壓縮格式。以下對(duì)幾種常用的情況進(jìn)行說(shuō)明。(1) 調(diào)用gzip程序來(lái)壓縮文件。gzip是GNU組織開發(fā)的一個(gè)壓縮程序,g
31、zip壓縮文件的后綴是.gz,與gzip相對(duì)的解壓程序是gunzip。tar中使用-z這個(gè)參數(shù)來(lái)調(diào)用gzip。例如:# tar -czf test.tar.gz *.jpg這條命令是將當(dāng)前目錄下的所有.jpg文件打包成一個(gè)tar包,并且將其用gzip程序壓縮,生成一個(gè)gzip壓縮過(guò)的包,壓縮包名為test.tar.gz。解開該壓縮包的用法如下:# tar -xzf test.tar.gz (2) 調(diào)用bzip2程序來(lái)壓縮文件。bzip2是Linux下的一個(gè)壓縮能力更強(qiáng)的壓縮程序,bzip2壓縮文件的后綴是bz2,與bzip2相對(duì)應(yīng)的解壓程序是bunzip2。tar中使用-j這個(gè)參數(shù)來(lái)調(diào)用gzi
32、p壓縮程序。例如:# tar -cjf test.tar.bz2 *.jpg該命令是將當(dāng)前目錄下所有.jpg的文件打包成一個(gè)tar包,并且將其用bzip2程序壓縮,生成一個(gè)bzip2壓縮過(guò)的包,壓縮包名為test.tar.bz2,解開該壓縮包的用法如下:# tar -xjf test.tar.bz25) rpm軟件包的安裝在使用任何操作系統(tǒng)的過(guò)程中,安裝和卸載軟件是必須的操作。Linux中有一套軟件包管理器,最初由Red Hat公司推出,稱為rpm(Red Hat Package Manager),它可以用來(lái)安裝、查詢、校驗(yàn)、刪除、更新rpm格式的軟件包。rpm軟件包包含可執(zhí)行的二進(jìn)制程序和該
33、程序運(yùn)行時(shí)所需要的文件,rpm格式的軟件包文件使用.rpm為擴(kuò)展名。與直接從源代碼安裝相比,軟件包管理易于安裝、更新和卸載軟件,也易于保護(hù)配置文件和跟蹤已安裝文件。安裝rpm軟件包的主要格式如下:# rpm -i 選項(xiàng) software.rpmrpm 命令主要有以下參數(shù):-i:安裝rpm軟件包。-t:測(cè)試安裝。-h:安裝時(shí)輸出hash記號(hào)(“#”),可以顯示安裝進(jìn)度。-f:忽略安裝過(guò)程中的任何錯(cuò)誤。-U:升級(jí)安裝rpm軟件包。-e:卸載已安裝的軟件包。-V:檢測(cè)軟件包軟件是否正確安裝。在安裝過(guò)程中,系統(tǒng)提示的“#”號(hào)就表示軟件安裝進(jìn)度,當(dāng)后面的百分比數(shù)字為100%時(shí)表示軟件安裝完成。6) 源碼
34、維護(hù)基本命令diff命令是生成源代碼補(bǔ)丁的必備工具,其命令格式如下:# diff 命令行選項(xiàng) 源文件 新文件diff 命令常用選項(xiàng)如下:-r:遞歸處理相應(yīng)目錄。-N:包含新文件到patch。-u:輸出統(tǒng)一格式,這種格式比缺省格式更緊湊些。-a:可以包含二進(jìn)制文件到patch。通??梢允褂胐iff命令加參數(shù)-ruN來(lái)比較兩個(gè)文件并生成一個(gè)補(bǔ)丁文件。這個(gè)補(bǔ)丁文件會(huì)列出這兩個(gè)不同版本文件的差異。比如有兩個(gè)文本文件:text1和text2,二者內(nèi)容不盡相同,現(xiàn)在來(lái)創(chuàng)建補(bǔ)丁文件:# diff -ruN test1.txt test2.txt test.patch補(bǔ)丁創(chuàng)建好以后需要給相應(yīng)文件/程序打好補(bǔ)丁
35、,這里就要用到patch命令,即# patch 命令行選項(xiàng) patch文件patch的詳細(xì)使用方法可參見patch的man help,常用的命令行選項(xiàng)是-pn(n是自然數(shù))。例如采用下面的指令來(lái)打好補(bǔ)?。? patch -p1 test.patch-p1選項(xiàng)代表patch文件名左邊目錄的層數(shù),考慮到頂層目錄在不同的系統(tǒng)上可能有所不同,要使用這個(gè)選項(xiàng),就要把patch文件放在要被打補(bǔ)丁的目錄下,然后在這個(gè)目錄中運(yùn)行“patch -p1 patchfile”命令。7) 配置、編譯、安裝源碼包軟件所謂源碼包軟件,顧名思義,就是源代碼可見的軟件包,在Linux系統(tǒng)下也經(jīng)常需要用到源碼包軟件。大多數(shù)的源
36、碼包軟件是以tar.gz或tar.bz2的形式得到的,所以在配置和編譯之前需要將軟件包解壓縮。具體的做法已經(jīng)在前面提到過(guò)。配置、編譯、安裝的過(guò)程大多如下所示:# ./configure# make# make install./configure用來(lái)配置軟件的功能。./configure比較重要的一個(gè)參數(shù)是-prefix,通過(guò)使用-prefix參數(shù),可以指定軟件的安裝目錄。比如,若指定軟件安裝到/home/tmp 目錄中,則可以執(zhí)行如下的指令:# ./configure -prefix=/home/tmp# make# make install8) 中斷Shell命令的執(zhí)行在Linux系統(tǒng)下,
37、一旦出現(xiàn)了Shell提示符,就可以鍵入命令名稱及命令所需要的參數(shù)。Shell將執(zhí)行這些命令。如果在執(zhí)行過(guò)程當(dāng)中想終止命令執(zhí)行,則可以從鍵盤上按“CtrlC”組合鍵發(fā)出中斷信號(hào)來(lái)中斷它。9) 模塊管理命令Linux內(nèi)核采用模塊化管理方式,這是Linux內(nèi)核的一大特點(diǎn),這也使得Linux整體結(jié)構(gòu)靈活,便于精簡(jiǎn)。(1) insmod(添加模塊)指令。Linux有許多功能是通過(guò)模塊的方式,在需要的時(shí)候才載入Kernel,這樣可使Kernel較為精簡(jiǎn),進(jìn)而提高效率。這些可動(dòng)態(tài)加載的模塊,通常是系統(tǒng)的設(shè)備驅(qū)動(dòng)程序。加載模塊采用insmod指令,其常用的格式如下:# insmod -fkmpsvxX -o
38、模塊文件其中的參數(shù)解釋如下:-f:不檢查目前Kernel版本與模塊編譯時(shí)的Kernel版本是否一致,強(qiáng)制將模塊載入。-k:將模塊設(shè)置為自動(dòng)卸載。-m:輸出模塊的載入信息。-p:測(cè)試模塊是否能正確地載入Kernel。-s:將所有信息記錄在系統(tǒng)記錄文件中。-v:執(zhí)行時(shí)顯示詳細(xì)的信息。-x:要匯出模塊的外部符號(hào)。-X:匯出模塊所有的外部符號(hào),此為預(yù)設(shè)置。(2) rmmod(卸載模塊)指令。Linux把系統(tǒng)的許多功能編譯成一個(gè)個(gè)單獨(dú)的模塊,待有需要時(shí)再分別加載它們,如果不再需要這些模塊,就可以使用rmmod命令來(lái)卸載這些模塊。其格式如下:# rmmod -as模塊名稱其使用參數(shù)說(shuō)明如下:-a:刪除所有
39、目前不需要的模塊。-s:把信息輸出至syslog常駐服務(wù),而非終端機(jī)界面。7.2.3 Shell編程實(shí)例Shell是一個(gè)命令解釋器,它會(huì)解釋并執(zhí)行命令提示符下輸入的命令。如果用戶想多次執(zhí)行一組命令,可以將這組命令存放在一個(gè)文件中,然后像在Linux系統(tǒng)中執(zhí)行其他程序一樣去執(zhí)行這個(gè)文件,這個(gè)命令文件就叫做Shell程序或者Shell腳本程序。Shell程序的權(quán)限至少應(yīng)該為可讀和可執(zhí)行。在Shell提示符下輸入文件名就可以執(zhí)行Shell程序。Shell程序可以通過(guò)環(huán)境變量、命令行參數(shù)和用戶的輸入3種方式接收數(shù)據(jù)。1Shell腳本的建立編輯Shell腳本文件可使用Linux下的普通編輯器,如vi、E
40、macs等。在建立Shell腳本程序的開始首先應(yīng)該指明使用哪種Shell來(lái)解釋所寫的腳本,以Bash腳本為例,腳本以“#!”開頭,后面將所使用的Shell路徑明確指出。比如:Bourne Shell的路徑為/bin/sh,而C Shell的路徑則為/bin/csh,下面的語(yǔ)句就是指定Bash解釋腳本:#! /bin/sh該語(yǔ)句說(shuō)明該腳本文件是一個(gè)Bash程序,需要由/bin目錄下的Bash程序來(lái)解釋執(zhí)行。為了增加程序的可讀性,Shell腳本語(yǔ)句也可以像高級(jí)語(yǔ)言那樣加注釋,在Bash腳本程序中從“#”開始到行尾的部分均被看做是程序的注釋語(yǔ)句。2Shell變量Shell編程中可使用變量,增加了程序
41、的靈活性。Shell中所有變量的取值都是一個(gè)字符串。Shell腳本中主要有系統(tǒng)變量、環(huán)境變量和用戶變量。其中,用戶變量在編程過(guò)程中使用頻繁;系統(tǒng)變量在對(duì)參數(shù)判斷和命令返回值判斷中會(huì)被使用;環(huán)境變量在程序運(yùn)行的時(shí)候需要設(shè)置。此外,Shell腳本的執(zhí)行不需要編譯,因此在Shell腳本中使用變量不必事先對(duì)變量進(jìn)行定義。1) Shell系統(tǒng)變量以下是常用到的Shell系統(tǒng)變量及其含義。$#:保存程序命令行參數(shù)的數(shù)目。$?:保存前一個(gè)命令的返回值。$0:當(dāng)前程序名。$*:以(“$1 $2 ”)的形式保存所有輸入的命令行參數(shù)。$:以(“$1”“$2”)的形式保存所有輸入的命令行參數(shù)。$n:$1為命令行的第
42、一個(gè)參數(shù),$2為命令行的第二個(gè)參數(shù),依此類推。2) Shell環(huán)境變量Shell環(huán)境變量是所有Shell程序都會(huì)接收的參數(shù)。Shell程序運(yùn)行時(shí),都會(huì)接收一組變量,這組變量就是環(huán)境變量。常用的環(huán)境變量如下:PATH:決定了Shell將到哪些目錄中尋找命令或程序。HOME:當(dāng)前用戶主目錄的完全路徑名。HISTSIZE:歷史記錄數(shù)。3) Shell用戶變量不管系統(tǒng)變量有多少,對(duì)于需求來(lái)說(shuō),總是不夠的,因此,Linux允許用戶自己定義變量,并對(duì)其進(jìn)行修改。這些由用戶自己定義的變量叫做用戶變量。(1) 變量名。用戶變量的變量名是以字母或下劃線開頭的,由字母、數(shù)字或下劃線組成,并且區(qū)分大小寫。(2) 變
43、量賦值。給用戶變量賦值的過(guò)程也是聲明一個(gè)變量的過(guò)程。變量的賦值很簡(jiǎn)單,其一般形式是:變量名=字符串/數(shù)字但要注意,等號(hào)兩邊不能有空格。例如:myname=jacknum=1(3) 取消變量。取消變量的命令如下:unset變量名例如:unset myname3流程控制1) 條件語(yǔ)句(1) if語(yǔ)句。if語(yǔ)句的語(yǔ)法格式如下:if 條件 then命令1命令2命令 nfiif語(yǔ)句執(zhí)行順序?yàn)楫?dāng)條件為真時(shí)執(zhí)行then后的命令,否則不執(zhí)行命令而直接執(zhí)行fi后的命令。另外要注意:if與“”之間,條件與左右兩邊的“”與“”之間都要有空格。(2) case語(yǔ)句。case命令是一個(gè)多分支語(yǔ)句,其基本命令格式如下:c
44、ase命令的執(zhí)行順序是:首先變量值與值1比較,相同,則執(zhí)行命令1,否則與值2比較,相同,則執(zhí)行命令2,依此類推。如果都不匹配,則執(zhí)行默認(rèn)的命令,即“*)”內(nèi)的命令。2) 循環(huán)語(yǔ)句循環(huán)語(yǔ)句要求反復(fù)執(zhí)行一個(gè)操作或一組命令,直到達(dá)到某個(gè)條件為止。下面簡(jiǎn)單介紹while和for循環(huán)語(yǔ)句。(1) while循環(huán)語(yǔ)句。while循環(huán)語(yǔ)句的語(yǔ)法格式如下:while 條件 do命令1命令2donewhile循環(huán)的執(zhí)行過(guò)程是:首先對(duì)條件進(jìn)行判斷,若條件為真,就執(zhí)行do和done之間的命令;反之,則退出循環(huán)。(2) for循環(huán)語(yǔ)句。forin循環(huán)能根據(jù)in后面的變量數(shù)目執(zhí)行循環(huán),其命令格式如下:for 自定義變量
45、in變量1變量2變量3 do命令donefor循環(huán)的執(zhí)行順序是:先把變量1的值賦給自定義變量,然后執(zhí)行do和done之間的命令;再把變量2的值賦給自定義變量,然后執(zhí)行do和done之間的命令。依此類推,一直到in后面所有的變量都賦予自定義變量為止,for循環(huán)才結(jié)束。4Shell腳本的執(zhí)行舉一個(gè)針對(duì)系統(tǒng)變量使用的例子,使用Vi編輯一個(gè)腳本文件,文件名為Example,其內(nèi)容如下:#! /bin/sh# Script name: Example echo “The No. of parameter is: $#”echo “The script name is: $0”echo The param
46、eters in the script are: $*保存該腳本文件后,執(zhí)行時(shí)系統(tǒng)會(huì)提示錯(cuò)誤,因?yàn)槲募?quán)限不夠,在終端下輸入命令“l(fā)s -l Example”,發(fā)現(xiàn)文件的權(quán)限為-rw-rr-,說(shuō)明不能執(zhí)行該文件。要執(zhí)行該腳本文件,需要改變文件權(quán)限,輸入命令“chmod 775 Example”,為文件添加可執(zhí)行的屬性。然后,在命令行中執(zhí)行該腳本程序,輸入命令:./Example Hello Linux命令行中的Hello Linux是其參數(shù),該程序執(zhí)行結(jié)果如下:The No. of parameter is: 2The script name is: ./Example The paramet
47、ers in the script are: Hello Linux7.2.4 程序編輯器編輯器是系統(tǒng)的重要工具之一。在各種操作系統(tǒng)中,編輯器都是必不可少的部件。Linux系統(tǒng)提供了一個(gè)完整的編輯器系列,如Ed、Ex、Vi和Emacs等,按功能它們可分為兩大類:(1) 行編輯器(如Ed、Ex);(2) 全屏編輯器(如Vi、Emacs)。行編輯器每次只能對(duì)一行進(jìn)行操作,使用起來(lái)不是很方便。而全屏編輯器可以對(duì)整個(gè)屏幕進(jìn)行編輯,用戶編輯的文件直接顯示在屏幕上,修改的結(jié)果可以立即看出來(lái),便于學(xué)習(xí)和使用。Vi(Visual Interface)和Emacs(Editing with MACros)是Li
48、nux下的兩個(gè)主要的編輯器,下面以Vi為例,對(duì)其使用進(jìn)行詳細(xì)的介紹。Vi編輯器最初是由Sun Microsystems公司的Bill Joy在1976年開發(fā)的。一開始Bill開發(fā)了Ex編輯器,后來(lái)開發(fā)了Vi作為Ex的Visual Interface。隨著技術(shù)的不斷進(jìn)步,基于Vi的各種變種版本不斷出現(xiàn),其中,移植特性最好、使用最廣泛的就是Vim編輯器。相比早期的Vi,Vim編輯器增加的一項(xiàng)最重要的功能便是多級(jí)撤銷,Vi只支持一級(jí)撤銷。Vi/Vim是Linux下最普遍的文本處理器之一,使用非常廣泛,Vi的命令繁多,但是功能強(qiáng)大,可以執(zhí)行輸出、刪除、查找、替換、塊操作等眾多文本操作,而且用戶可以根據(jù)
49、自己的需要對(duì)其進(jìn)行定制。在終端下輸入Vim命令就可以看到Vi的界面,如圖7-12所示。圖7-12 Vi的界面Vi有3種基本工作模式:指令模式、文本輸入模式和末行模式。它們的相互關(guān)系如圖7-13所示。圖7-13 Vi的模式切換關(guān)系1指令模式指令模式主要使用方向鍵移動(dòng)光標(biāo)位置以進(jìn)行文字的編輯。在輸入模式下按【Esc】鍵或是在末行輸入了錯(cuò)誤命令,都會(huì)回到指令模式。表7-1列出了指令模式常用操作命令及其含義。2文本輸入模式在Vim下編輯文字,不能直接插入、替代或刪除文字,而必須先進(jìn)入輸入模式。要進(jìn)入輸入模式,可以在指令模式下按【a/A】鍵、【i/I】鍵或【o/O】鍵,它們的命令及其含義如表7-2所示。
50、3末行模式末行模式主要用來(lái)進(jìn)行一些文字編輯輔助功能,比如字串搜尋、替代、保存文件等。表7-3介紹了一些常用的末行模式命令及其含義。下面以編輯一個(gè)簡(jiǎn)單的腳本程序?yàn)槔齺?lái)介紹Vi的簡(jiǎn)單使用方法,其主要流程如下:在終端輸入命令 Vi filename 來(lái)建立一個(gè)文件名為filename的文件,可以是文本文件、C/C+程序等。例如:vi hello輸入命令,表示要編輯一個(gè)文件名為hello的文件,回車后就進(jìn)入了Vi的編輯界面,如圖7-14所示。圖7-14 Vi的編輯界面此時(shí)的Vi是指令模式,輸入“:set nu”來(lái)設(shè)置行號(hào)。若此時(shí)輸入末行模式,末行模式不能自己切換到文本輸入模式,需要先切換到指令模式,按
51、【Esc】鍵進(jìn)入指令模式。(1) 輸入“i”進(jìn)入文本輸入模式。在指令模式下輸入“i”進(jìn)入文本輸入模式,并編輯文本內(nèi)容,如圖7-15所示。(2) 保存、修改編輯內(nèi)容并退出Vi程序。在輸入模式下編輯并修改相應(yīng)內(nèi)容,編輯好之后需要再返回到指令模式(Esc),之后輸入“:wq”就可以保存并退出剛才的編輯程序了。圖7-15 輸入“i”進(jìn)入文本輸入模式 7.3 嵌入式Linux操作系統(tǒng)的開發(fā)工具7.3.1 編譯器GCC Linux操作系統(tǒng)下的GCC(GNU C Compiler)是GNU(提供全套免費(fèi)軟件的組織)推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU項(xiàng)目的編譯器組件之一。經(jīng)過(guò)幾十年的發(fā)展,GCC
52、不僅支持C語(yǔ)言,還支持C+語(yǔ)言、Java語(yǔ)言、Objective語(yǔ)言、Ada語(yǔ)言、Pascal語(yǔ)言、COBOL語(yǔ)言以及支持函數(shù)式編程和邏輯編程的Mercury語(yǔ)言,等等。目前的GCC已經(jīng)發(fā)展成為GNU Compiler Collection(即GNU編譯器家族),它是Linux下最重要的軟件開發(fā)工具之一。1GCC的執(zhí)行過(guò)程GCC是一個(gè)交叉平臺(tái)的編譯器,目前支持所有主流CPU處理器平臺(tái),可以完成從C、C+、Objective-C等源文件向運(yùn)行在特定CPU硬件平臺(tái)上的目標(biāo)代碼的轉(zhuǎn)換。GCC編譯器所能支持的源程序的格式如表7-4所示。GNU是一組編譯工具的總稱,其軟件包里面包含眾多的工具,按其類型,
53、主要有以下幾類:(1) C編譯器:cc,cc1,cclplus,gcc。(2) C+編譯器:c+,cclplus,g+。(3) 源碼預(yù)處理程序:cpp,cpp0。(4) 庫(kù)文件:libgcc.a,libgcc_eh.a,libgcc_s.so,libiberty.a,libstdc+.a,so,libsupc+.a。GCC編譯器的編譯過(guò)程可以分為四個(gè)階段,即預(yù)處理(Pre-Processing)、編譯(Compiling)、匯編(Assembling)和鏈接(Linking)。下面以一個(gè)程序來(lái)說(shuō)明編譯的過(guò)程。/* sample1.c */#include int main ( )printf
54、(“Wish you Happy! ”);return 0;這個(gè)程序是要打印出一條信息。可以使用下面的命令來(lái)編譯這個(gè)例子:# gcc -o sample1 sample1.c在實(shí)際編譯的時(shí)候,GCC首先調(diào)用cpp命令進(jìn)行預(yù)處理,主要實(shí)現(xiàn)對(duì)源代碼編譯前的預(yù)處理,比如將源代碼中指定的頭文件包含進(jìn)來(lái)。接著調(diào)用ccl命令進(jìn)行編譯,作為整個(gè)編譯過(guò)程的一個(gè)中間步驟,該過(guò)程會(huì)將源代碼翻譯生成匯編代碼。匯編過(guò)程是針對(duì)匯編語(yǔ)言的步驟,調(diào)用as命令進(jìn)行工作,生成擴(kuò)展名為.o的目標(biāo)文件,此例中為sample.o。當(dāng)所有的目標(biāo)文件都生成之后,GCC就調(diào)用連接器ld來(lái)完成最后的關(guān)鍵性工作鏈接,生成指定的目標(biāo)文件samp
55、le。如果在編譯的時(shí)候沒(méi)有給出可執(zhí)行文件的名字,則GCC將生成一個(gè)名為a.out的文件。2. GCC的基本用法和選項(xiàng)在使用GCC編譯器的時(shí)候,必須給出一系列必要的調(diào)用參數(shù)和文件名稱。GCC編譯器的調(diào)用參數(shù)大約有100多個(gè),合理地使用其命令選項(xiàng)可以有效提高程序的編譯效率、優(yōu)化代碼。不過(guò)其中多數(shù)參數(shù)我們根本用不到,這里只介紹幾個(gè)最基本、最常用的參數(shù)。GCC最基本的使用語(yǔ)法如下:gcc options | filenames對(duì)于編譯C+的源程序,其基本語(yǔ)法如下:g+ options | filenames 其中,options就是編譯器所需要的參數(shù);filenames表示所給出的相關(guān)的文件名稱。常用
56、參數(shù)如下:(1) -c:只編譯,不鏈接成可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成以.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。例如執(zhí)行指令:# gcc -c test.c 在當(dāng)前目錄下生成一個(gè)名為test.o的目標(biāo)文件。(2) -S:使用該選項(xiàng)會(huì)生成一個(gè)后綴名為.s的匯編語(yǔ)言文件,但是同樣不會(huì)生成可執(zhí)行的程序。(3) -o:在默認(rèn)的狀態(tài)下,如果GCC沒(méi)有指定編譯選項(xiàng),則會(huì)在當(dāng)前目錄下生成一個(gè)名為a.out的可執(zhí)行文件。例如:執(zhí)行命令“# gcc test.c”之后會(huì)生成一個(gè)a.out的可執(zhí)行程序。因此,為了指定生成的可執(zhí)行程序的文件名,就可以采用-o選項(xiàng),比如下面的指
57、令:# gcc -o test test.c 在當(dāng)前目錄下生成一個(gè)名為test的可執(zhí)行文件。(4) -g:產(chǎn)生符號(hào)調(diào)試工具所必要的符號(hào)信息,要想對(duì)源代碼進(jìn)行調(diào)試,就必須加入這個(gè)選項(xiàng)。這樣,gdb調(diào)試器就可以根據(jù)這些調(diào)試信息來(lái)跟蹤程序的執(zhí)行狀態(tài)。(5) -pg:編譯完成之后,額外產(chǎn)生一個(gè)性能分析所需的信息。(6) -I :庫(kù)依賴選項(xiàng),將DIR所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過(guò)程中使用的參數(shù)。在Linux下開發(fā)程序時(shí),通常來(lái)講都需要借助一個(gè)或多個(gè)函數(shù)庫(kù)的支持才能夠完成相應(yīng)的功能。一般情況下,Linux下的大多數(shù)函數(shù)都將頭文件放到系統(tǒng)/usr/include/目錄下,而庫(kù)文件則放到
58、/usr/lib/目錄下。但在有些情況下并不是這樣的,在這些情況下,使用GCC編譯時(shí)必須指定所需要的頭文件和庫(kù)文件所在的路徑。-I選項(xiàng)可以向GCC的頭文件搜索路徑中添加新的目錄。例如,一個(gè)源程序所依賴的頭文件在用戶/home/include/目錄下,此時(shí)就應(yīng)該使用-I選項(xiàng)來(lái)指定:# gcc -I /home/include -o test test.c(7) -L :類似上面的情況,用來(lái)特別指定所依賴庫(kù)所在的路徑。如果使用了不在標(biāo)準(zhǔn)位置上的庫(kù),那么可以通過(guò)-L選項(xiàng)向GCC的庫(kù)文件搜索路徑中添加新的目錄。例如,一個(gè)程序要用到的庫(kù)libapp.so在/home/hzdz/lib/目錄下,為了讓GC
59、C能夠順利地鏈接該庫(kù),可以使用下面的命令:# gcc -L /home/hzdz/lib -lapp -o test test.c這里的-L選項(xiàng)表示GCC去鏈接庫(kù)文件libapp.so。Linux下的庫(kù)文件在命名時(shí)有一個(gè)約定,那就是應(yīng)該以lib三個(gè)字母開頭,由于所有的庫(kù)文件都遵循了同樣的規(guī)范,因此在用-L選項(xiàng)指定鏈接的庫(kù)文件名時(shí)可以省去lib三個(gè)字母,也就是說(shuō),GCC在對(duì)-lapp進(jìn)行處理時(shí),會(huì)自動(dòng)去鏈接名為libapp.so的文件。(8) -static選項(xiàng):GCC在默認(rèn)情況下鏈接的是動(dòng)態(tài)庫(kù),有時(shí)為了把一些函數(shù)靜態(tài)編譯到程序中而無(wú)需鏈接動(dòng)態(tài)庫(kù),就采用-static選項(xiàng),它會(huì)強(qiáng)制程序鏈接靜態(tài)庫(kù)
60、。(9) -E:生成.i文件,讓gcc在預(yù)處理后停止編譯,從而生產(chǎn).i文件,此文件中包含有所預(yù)處理的信息。(10) -v:在Shell的提示符下鍵入gcc -v,屏幕上會(huì)顯示目前正在使用的GCC的版本信息。(11) -x language:強(qiáng)制編譯器用指定的語(yǔ)言編譯器來(lái)編譯某個(gè)源程序。例如:# gcc x c+ test.c 該指令表示強(qiáng)制采用C+編譯器來(lái)編譯C程序test.c。(12) -O:對(duì)程序進(jìn)行優(yōu)化編譯、鏈接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、鏈接過(guò)程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、鏈接的速度會(huì)相應(yīng)慢一些。(13) -O2:比-O更好的優(yōu)化編譯、鏈
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)鋰電池正極材料市場(chǎng)發(fā)展趨勢(shì)及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)鋁冶煉行業(yè)運(yùn)行動(dòng)態(tài)與前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)菱鎂礦產(chǎn)業(yè)競(jìng)爭(zhēng)格局與十三五規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)聯(lián)苯雙酯行業(yè)市場(chǎng)運(yùn)行狀況與十三五規(guī)劃分析報(bào)告
- 2025-2030年中國(guó)粘玉米行業(yè)規(guī)模分析及發(fā)展建議研究報(bào)告
- 2025-2030年中國(guó)空管系統(tǒng)市場(chǎng)十三五規(guī)劃與投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)畜禽養(yǎng)殖中抗生素行業(yè)發(fā)展?fàn)顩r及投資戰(zhàn)略研究報(bào)告
- 東北財(cái)經(jīng)大學(xué)《中醫(yī)護(hù)理學(xué)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東江門幼兒師范高等??茖W(xué)校《面向?qū)ο笈c可視化編程》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州工商學(xué)院《健康服務(wù)與營(yíng)銷學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 中華人民共和國(guó)學(xué)前教育法-知識(shí)培訓(xùn)
- 2023年新高考(新課標(biāo))全國(guó)2卷數(shù)學(xué)試題真題(含答案解析)
- 事業(yè)單位工作人員獎(jiǎng)勵(lì)審批表
- 人教版六年級(jí)美術(shù)下冊(cè)全冊(cè)課件【完整版】
- GB/T 9788-1988熱軋不等邊角鋼尺寸、外形、重量及允許偏差
- 教科版三年級(jí)下冊(cè)科學(xué)全冊(cè)完整課件
- 上海小弄堂-電子小報(bào)
- 軌道交通安全專題培訓(xùn)
- 物理化學(xué)完整版答案
- 節(jié)流孔板孔徑計(jì)算
- 學(xué)生流失率考核辦法(試行)
評(píng)論
0/150
提交評(píng)論