201-linux環(huán)境下程序開發(fā)基礎(chǔ)-2_第1頁
201-linux環(huán)境下程序開發(fā)基礎(chǔ)-2_第2頁
201-linux環(huán)境下程序開發(fā)基礎(chǔ)-2_第3頁
201-linux環(huán)境下程序開發(fā)基礎(chǔ)-2_第4頁
201-linux環(huán)境下程序開發(fā)基礎(chǔ)-2_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Linux環(huán)境下編譯10/8/20222/34GCC簡(jiǎn)介

gcc(GNU

C

Compiler)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU的代表作品之一。

gcc編譯器能將C、C++語言源程序、匯程式化序和目標(biāo)程序編譯、連接成可執(zhí)行文件.10/8/20223/34GCC常用編譯參數(shù)

-c:只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。

-o

output_filename:確定輸出文件的名稱為

output_filename,同時(shí)這個(gè)名稱不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。

-O:對(duì)程序進(jìn)行優(yōu)化編譯、連接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、連接過程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但

是,編譯、連接的速度就相應(yīng)地要慢一些。10/8/20224/34GCC常用編譯參數(shù)

-Idirname:將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過程中使用的參數(shù)。C程序中的頭文件包含兩種情況:#include

<stdio.h>#include

“myinc.h”其中,A類使用尖括號(hào)(<>),B類使用雙引號(hào)(“”)。對(duì)于A類,預(yù)處理程序cpp在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中搜尋相應(yīng)的文件,而對(duì)于B類,cpp在當(dāng)前目錄中搜尋頭文件,這個(gè)選項(xiàng)的作用是告訴cpp,如果在當(dāng)前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設(shè)計(jì)中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個(gè)使用-I選項(xiàng)給出搜索路徑。10/8/20225/34GCC常用編譯參數(shù)

-Ldirname:將dirname所指出的目錄加入到程序函數(shù)檔案庫文件的目錄列表中,是在連接過程中使用的參數(shù)。在預(yù)

設(shè)狀態(tài)下,連接程序ld在系統(tǒng)的預(yù)設(shè)路徑中(如/usr/lib)尋找所需要的檔案庫文件,這個(gè)選項(xiàng)告訴連接程序,首先到-L指定的目錄中去尋找,然后到系統(tǒng)預(yù)設(shè)路徑中尋找,如果函數(shù)庫存放在多個(gè)目錄下,就需要依次使用這個(gè)選項(xiàng),給出相應(yīng)的存放目錄。

-lname:在連接時(shí),裝載名字為“l(fā)ibname.a”的函數(shù)庫,該函數(shù)庫位于系統(tǒng)預(yù)設(shè)的目錄或者由-L選項(xiàng)確定的目錄下。例如,-lm表示連接名為“l(fā)ibm.a”的數(shù)學(xué)函數(shù)庫。上面我們簡(jiǎn)要介紹了gcc編譯器最常用的功能和主要參數(shù)選項(xiàng),更為詳盡的資料可以參看Linux系統(tǒng)的聯(lián)機(jī)幫助。10/8/20226/34一個(gè)簡(jiǎn)單的例子—hello.c用vi編寫源文件:

#include<stdio.h> void

main(){printf(“hello

world.\n”);}用gcc編譯gcc

hello.c運(yùn)行

a.out10/8/20227/34GCC應(yīng)用舉例gcc

hello.cgcc

helo.c

–o

hello生成a.out生成hellogcc–O

hello.c–o

hello生成hellogcc–c

hello.c

生成hello.ogcc

hello.o–o

hello生成hello5.

gcc

–c

hello1.cgcc

–c

hello2.c生成hello1.o生成hello2.ogcc

hello1.o

hello2.o–o

hello生成hello6.

gcc

test1.o

–lm

–I/home/czn/include

–o

t10/8/20228/34Make簡(jiǎn)介

在開發(fā)大系統(tǒng)時(shí),經(jīng)常要將程序劃分為許多模塊。各個(gè)模塊之間存在著各種各樣的依賴關(guān)系,在Linux中通常使用

Makefile來管理。由于各個(gè)模塊間不可避免存在關(guān)聯(lián),所以當(dāng)一個(gè)模塊改動(dòng)后,其他模塊也許會(huì)有所更新,當(dāng)然對(duì)小系統(tǒng)來

說,手工編譯連接是沒問題,但是如果是一個(gè)大系統(tǒng),存在很多個(gè)模塊,那么手工編譯的方法就不適用了。為此,在Linux系統(tǒng)中,專門提供了一個(gè)make命令來自動(dòng)維護(hù)目標(biāo)文件。與手工編譯和連接相比,make命令的優(yōu)點(diǎn)在于他只更新修改過的文件,而對(duì)沒修改的文件則置之不理,并且make命令不會(huì)漏掉一個(gè)需要更新的文件。10/8/20229/34一個(gè)簡(jiǎn)單的例子先舉一個(gè)例子:a.c

b.c兩個(gè)程序a.cextern

void

p(char

*);main(){p("hello

world");}b.cvoid

p(char

*str){printf("%s\n",str);}z

Makefilehello:

a.c

b.cgcc

a.c

b.c

-o

helloz

執(zhí)行makegcc

a.c

b.c

-o

hello注意這里是一個(gè)Tab產(chǎn)生一個(gè)叫hello的可執(zhí)行程序10/8/202210/34書寫makefile文件

Makefile時(shí)由規(guī)則來組成的,每一條規(guī)則都有三部分組成:目

標(biāo)(object),依賴(dependency)和命令(command).在上面的例子中,Makefile只有一條規(guī)則,其目標(biāo)為hello,期依賴為a.c

b.c其命令為gcc

a.c

b.c-o

hello.

依賴可以是另一條規(guī)則的目標(biāo),也可以是文件.每一條規(guī)則被這樣處理.如目標(biāo)是一個(gè)文件是:當(dāng)它的依賴是文件時(shí),如果依賴的時(shí)間比目標(biāo)要新,則運(yùn)行規(guī)則所包含的命令來更新目標(biāo);如果依賴是另一個(gè)目標(biāo)則用同樣的方法先來處理這個(gè)目標(biāo).如目標(biāo)不是一個(gè)存在的文件時(shí),則一定執(zhí)行.10/8/202211/34一個(gè)簡(jiǎn)單的makefile文件

例如:Makefilehello:a.o

b.ogcc

a.o

b.o

-o

helloa.o:

a.cgcc

–c

a.cb.o:

b.cgcc

–c

b.c

當(dāng)運(yùn)行make時(shí),可以接一目標(biāo)名(eg:make

hello)作為參數(shù),表示要處理改目標(biāo)。如沒有參數(shù),則處理第一個(gè)目標(biāo)。對(duì)上述例子執(zhí)行make,則是處理hello這個(gè)目標(biāo)。

hello依賴于文件目標(biāo)a.o和b.o,則先去處理a.o,調(diào)用gcc–c

a.c來更新a.o,之后更新b.o,最后調(diào)用gcc

a.c

b.o-o

hello來更新hello.10/8/202212/34Make中的宏(macro)在make中是用宏,要先定義,然后在makefile中引用。宏的定義格式為:宏名=宏的值例:CC

=

gcchello:

a.o

b.o(宏名一般習(xí)慣用大寫字母)$(CC)

a.o

b.o

-o

helloa.o:

a.c$(CC)

–c

a.cb.o:

b.c$(CC)

–c

b.c10/8/202213/34系統(tǒng)定義的宏

還有一些設(shè)定好的內(nèi)部變量,它們根據(jù)每一個(gè)規(guī)則內(nèi)容定義。$@當(dāng)前規(guī)則的目的文件名$<依靠列表中的第一個(gè)依靠文件$^整個(gè)依靠的列表(除掉了里面所有重復(fù)的文件名)。$?依賴中所有新于目標(biāo)的

以用變量做許多其它的事情,特別是當(dāng)你把它們和函數(shù)混合使用的時(shí)候。如果需要更進(jìn)一步的了解,請(qǐng)參考GNUMake手冊(cè)。("man

make","man

makefile")10/8/202214/34修改原先的makefileCC =

gccCFLAGS

=

-OOBJS =

a.o

b.ohello:

$(OBJS)$(CC)

$^

-o

$@a.o:

a.c$(CC)

$(CFLAGS)

-c

$<b.o:

b.c$(CC)

$(CFLAGS)

-c

$<clean:rm

–f

*.o

hello10/8/202215/34隱含規(guī)則請(qǐng)注意在上面的例子里,幾個(gè)產(chǎn)生.o文件的命令都是一樣的,都是從.

c文件和相關(guān)文件里產(chǎn)生.o文件,這是一個(gè)標(biāo)準(zhǔn)的步驟。其實(shí)make已經(jīng)知道怎么做—它有一些叫做隱含規(guī)則的內(nèi)置的規(guī)則,這些規(guī)則告訴它當(dāng)你沒有給出某些命令的時(shí)候,應(yīng)該怎么辦。如果你把生成a.o和b.o的命令從它們的規(guī)則中刪除,make將會(huì)查找它的隱含規(guī)則,然后會(huì)找到一個(gè)適當(dāng)?shù)拿睢?0/8/202216/34用戶環(huán)境變量的設(shè)定10/8/202217/34LINUX中BASH環(huán)境變量的設(shè)定順序

登錄Linux后,BASH要讀取幾個(gè)文件,這些文件(啟動(dòng)腳本文件)用來定義BASH環(huán)境,如果希望建立標(biāo)準(zhǔn)的別名,或者希望設(shè)置各種

shell變量,就應(yīng)該在bash啟動(dòng)文件中進(jìn)行設(shè)置。和Bash的環(huán)境設(shè)定有關(guān)的文件有/etc/profile(主要)/etc/profile.d/*.sh(主要)$HOME/.bash_profile(主要)$HOME/.bash_login$HOME/.profile$HOME/.bash_logout(主要)$HOME/.bashrc(主要)/etc/bashrc10/8/202218/34LINUX中BASH環(huán)境變量的設(shè)定順序登入(login)交互式時(shí)(從字符終端或X

Window登錄)先執(zhí)行/etc/profile(包括/etc/profile.d/*.sh)接著bash會(huì)檢查使用者的自家目錄中,是否有.bash_profile或者.bash_login或者.profile,若有,則會(huì)執(zhí)行其中一個(gè),執(zhí)行順序?yàn)椋?bash_profile最優(yōu)先.bash_login其次.profile最后(執(zhí)行最先碰到的一個(gè),前面的設(shè)定會(huì)被后面的覆蓋)啟動(dòng)后讀取.bashrc10/8/202219/34LINUX中BASH環(huán)境變量的設(shè)定順序各文件用途說明1、/etc/profile由root所控制,用來設(shè)定適合全體使用者的shell環(huán)境

2、若使用者自

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論