Linux環(huán)境下程序編譯_第1頁(yè)
Linux環(huán)境下程序編譯_第2頁(yè)
Linux環(huán)境下程序編譯_第3頁(yè)
Linux環(huán)境下程序編譯_第4頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Linux環(huán)境下程序編譯曙光信息產(chǎn)業(yè)(北京)有限公司1提綱1.GCC編譯2.Make簡(jiǎn)介2一個(gè)簡(jiǎn)單的例子—hello.c用vi編寫(xiě)源文件:#include<stdio.h>voidmain(){

printf(“helloworld.\n”);}用gcc編譯

gcc

hello.c運(yùn)行a.out3GCC簡(jiǎn)介(1/2)gcc(GNUComplilerCollection)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU的代表作品之一。gcc編譯器能將C、Fortran,C++語(yǔ)言源程序、匯程式化序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如果沒(méi)有給出可執(zhí)行文件的名字,gcc將生成一個(gè)名為a.out的文件。gcc最基本的用法是∶

gcc[options][filenames]

其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱(chēng)4GCC簡(jiǎn)介(2/2)在Linux系統(tǒng)中,可執(zhí)行文件沒(méi)有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來(lái)區(qū)分可執(zhí)行文件和不可執(zhí)行文件。而gcc則通過(guò)后綴來(lái)區(qū)別輸入文件的類(lèi)別.c為后綴的文件,C語(yǔ)言源代碼文件.f為后綴的文件,F(xiàn)ortran77語(yǔ)言源代碼文件.f90為后綴的文件,F(xiàn)ortran90語(yǔ)言源代碼文件.C,.cc或.cxx

為后綴的文件,是C++源代碼文件.h為后綴的文件,是程序所包含的頭文件.o為后綴的文件,是編譯后的目標(biāo)文件,也是靜態(tài)庫(kù)文件.so為后綴的文件,動(dòng)態(tài)庫(kù)文件.a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫(kù)文件5GCC常用編譯參數(shù)(1/3)-c:只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。-ooutput_filename:確定輸出文件的名稱(chēng)為output_filename,同時(shí)這個(gè)名稱(chēng)不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。-g:產(chǎn)生符號(hào)調(diào)試工具(GNU的gdb)所必要的符號(hào)資訊,要使用gdb對(duì)源代碼進(jìn)行調(diào)試,我們就必須加入這個(gè)選項(xiàng)。-O:對(duì)程序進(jìn)行優(yōu)化編譯、連接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、連接過(guò)程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。-O2:比-O更好的優(yōu)化編譯、連接,當(dāng)然整個(gè)編譯、連接過(guò)程會(huì)更慢。6GCC常用編譯參數(shù)(2/3)-Idirname:將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過(guò)程中使用的參數(shù)。C程序中的頭文件包含兩種情況:A)#include<stdio.h>B)#include“myinc.h”

其中,A類(lèi)使用尖括號(hào)(<>),B類(lèi)使用雙引號(hào)(“”)。對(duì)于A類(lèi),預(yù)處理程序cpp在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中搜尋相應(yīng)的文件,而對(duì)于B類(lèi),cpp在當(dāng)前目錄中搜尋頭文件,這個(gè)選項(xiàng)的作用是告訴cpp,如果在當(dāng)前目錄中沒(méi)有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設(shè)計(jì)中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個(gè)使用-I選項(xiàng)給出搜索路徑。7GCC常用編譯參數(shù)(3/3)-Ldirname:將dirname所指出的目錄加入到程序函數(shù)檔案庫(kù)文件的目錄列表中,是在連接過(guò)程中使用的參數(shù)。在預(yù)設(shè)狀態(tài)下,連接程序ld在系統(tǒng)的預(yù)設(shè)路徑中(如/usr/lib)尋找所需要的檔案庫(kù)文件,這個(gè)選項(xiàng)告訴連接程序,首先到-L指定的目錄中去尋找,然后到系統(tǒng)預(yù)設(shè)路徑中尋找,如果函數(shù)庫(kù)存放在多個(gè)目錄下,就需要依次使用這個(gè)選項(xiàng),給出相應(yīng)的存放目錄。-lname:在連接時(shí),裝載名字為“l(fā)ibname.a”的函數(shù)庫(kù),該函數(shù)庫(kù)位于系統(tǒng)預(yù)設(shè)的目錄或者由-L選項(xiàng)確定的目錄下。例如,-lm表示連接名為“l(fā)ibm.a”的數(shù)學(xué)函數(shù)庫(kù)。

上面我們簡(jiǎn)要介紹了gcc編譯器最常用的功能和主要參數(shù)選項(xiàng),更為詳盡的資料可以參看Linux系統(tǒng)的聯(lián)機(jī)幫助。8GCC應(yīng)用舉例1.gcc

hello.c

生成a.out2.gcc–ohellohello.c

生成hello3.gcc–O–ohellohello.c

生成hello4.gcc–O2–ohellohello.c

生成hello5.gcc–chello.c

生成hello.o

gcc–ohellohello.o

生成hello6.gcc–chello1.c 生成hello1.o

gcc–chello2.c 生成hello2.o

gcc–ohellohello1.ohello2.o生成hello7.gcc–otesttest.o–lm–I/home/czn/include9Make簡(jiǎn)介在開(kāi)發(fā)大系統(tǒng)時(shí),經(jīng)常要將程序劃分為許多模塊。各個(gè)模塊之間存在著各種各樣的依賴關(guān)系,在Linux中通常使用Makefile來(lái)管理。由于各個(gè)模塊間不可避免存在關(guān)聯(lián),所以當(dāng)一個(gè)模塊改動(dòng)后,其他模塊也許會(huì)有所更新,當(dāng)然對(duì)小系統(tǒng)來(lái)說(shuō),手工編譯連接是沒(méi)問(wèn)題,但是如果是一個(gè)大系統(tǒng),存在很多個(gè)模塊,那么手工編譯的方法就不適用了。為此,在Linux系統(tǒng)中,專(zhuān)門(mén)提供了一個(gè)make命令來(lái)自動(dòng)維護(hù)目標(biāo)文件。與手工編譯和連接相比,make命令的優(yōu)點(diǎn)在于他只更新修改過(guò)的文件,而對(duì)沒(méi)修改的文件則置之不理,并且make命令不會(huì)漏掉一個(gè)需要更新的文件。10一個(gè)簡(jiǎn)單的例子先舉一個(gè)例子:a.c

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

externvoidp(char*);

main()

{

p("helloworld");

}

b.c

voidp(char*str)

{

printf("%sn",str);

}Makefile

hello:a.cb.c

gcca.cb.c-ohello注意這里是一個(gè)Tab執(zhí)行make

gcca.cb.c-ohello

產(chǎn)生一個(gè)叫hello的可執(zhí)行程序11書(shū)寫(xiě)makefile文件Makefile時(shí)由規(guī)則來(lái)組成的,每一條規(guī)則都有三部分組成:目標(biāo)(object),依賴(dependency)和命令(command).在上面的例子中,Makefile只有一條規(guī)則,其目標(biāo)為hello,期依賴為a.c

b.c,其命令為gcc

a.c

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

b.o

gcc

a.o

b.o-ohello

a.o:a.c

gcc–ca.c

b.o:b.c

gcc–cb.c當(dāng)運(yùn)行make時(shí),可以接一目標(biāo)名(eg:makehello)作為參數(shù),表示要處理改目標(biāo)。如沒(méi)有參數(shù),則處理第一個(gè)目標(biāo)。對(duì)上述例子執(zhí)行make,則是處理hello這個(gè)目標(biāo)。hello依賴于文件目標(biāo)a.o和b.o,則先去處理a.o,調(diào)用gcc–ca.c來(lái)更新a.o,之后更新b.o,最后調(diào)用gcc

a.c

b.o-ohello來(lái)更新hello.13Make中的宏(macro)在make中是用宏,要先定義,然后在makefile中引用。宏的定義格式為:宏名=宏的值(宏名一般習(xí)慣用大寫(xiě)字母)例:

CC=gcchello:a.o

b.o

$(CC)a.o

b.o-ohello

a.o:a.c

$(CC)–ca.c

b.o:b.c

$(CC)–cb.c14系統(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è)。('manmake','manmakefile')15修改原先的makefileCC=gccCFLAGS=-O2OBJS=a.o

b.o

hello:$(OBJS) $(CC)$^-o$@a.o:a.c $(CC)$(CFLAGS

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論