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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

gcc(GNU

C

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

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

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

-o

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

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

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

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

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

<stdio.h>#include

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

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

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

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

#include<stdio.h> void

main(){printf(“hello

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

hello.c運行

a.out10/8/20227/34GCC應用舉例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簡介

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

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

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

b.c兩個程序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注意這里是一個Tab產(chǎn)生一個叫hello的可執(zhí)行程序10/8/202210/34書寫makefile文件

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

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

b.c其命令為gcc

a.c

b.c-o

hello.

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

例如:Makefilehello:a.o

b.ogcc

a.o

b.o

-o

helloa.o:

a.cgcc

–c

a.cb.o:

b.cgcc

–c

b.c

當運行make時,可以接一目標名(eg:make

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

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

a.c來更新a.o,之后更新b.o,最后調用gcc

a.c

b.o-o

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

=

gcchello:

a.o

b.o(宏名一般習慣用大寫字母)$(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)定義的宏

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

以用變量做許多其它的事情,特別是當你把它們和函數(shù)混合使用的時候。如果需要更進一步的了解,請參考GNUMake手冊。("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ī)則請注意在上面的例子里,幾個產(chǎn)生.o文件的命令都是一樣的,都是從.

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

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

shell變量,就應該在bash啟動文件中進行設置。和Bash的環(huá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)境變量的設定順序登入(login)交互式時(從字符終端或X

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

2、若使用者自

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論