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

下載本文檔

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

文檔簡(jiǎn)介

1、1LINUX 環(huán)境下程序開(kāi)發(fā)基礎(chǔ)環(huán)境下程序開(kāi)發(fā)基礎(chǔ)曙光用戶(hù)培訓(xùn)課程系列課程時(shí)間:1.5小時(shí)更新日期:2008年3月2022-3-222LinuxLinux環(huán)境下環(huán)境下程序編譯程序編譯2022-3-223Linux與C Linux與C是天然的結(jié)合,從它們的誕生開(kāi)始就有密切的聯(lián)系:Linux的前身Unix在用C語(yǔ)言改寫(xiě)之后才為世界所廣泛接受;而C語(yǔ)言也是在Unix編寫(xiě)、傳播的過(guò)程中發(fā)展和流行起來(lái)的 Linux平臺(tái)為C語(yǔ)言提供的編譯工具是gcc。Gcc除了處理一般的C語(yǔ)言程序,還支持C+、Objective C等一些語(yǔ)言。曙光4000A提供了PGI C/C+ compiler pgcc/pgCC L

2、inux系統(tǒng)與其他系統(tǒng)類(lèi)似,C語(yǔ)言程序的運(yùn)行過(guò)程分為三步: 編寫(xiě)源代碼 用編譯工具編譯連接,生成可執(zhí)行文件 運(yùn)行該可執(zhí)行文件2022-3-224一個(gè)簡(jiǎn)單的例子hello.c 用vi編寫(xiě)源文件:#include void main() printf(“hello world.n”); 用gcc編譯 gcc hello.c 運(yùn)行 a.out 2022-3-225GCC簡(jiǎn)介gcc(GNU C Compiler)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU的代表作品之一。gcc編譯器能將C、C+語(yǔ)言源程序、匯程式化序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如果沒(méi)有給出可執(zhí)行文件的名字,gcc將生

3、成一個(gè)名為a.out的文件。在Linux系統(tǒng)中,可執(zhí)行文件沒(méi)有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來(lái)區(qū)分可執(zhí)行文件和不可執(zhí)行文件。而gcc則通過(guò)后綴來(lái)區(qū)別輸入文件的類(lèi)別,下面我們來(lái)介紹gcc常用的一些后綴。 .c為后綴的文件,C語(yǔ)言源代碼文件 .a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫(kù)文件 .C,.cc或.cxx 為后綴的文件,是C+源代碼文件 .h為后綴的文件,是程序所包含的頭文件 .o為后綴的文件,是編譯后的目標(biāo)文件 gcc最基本的用法是 gcc options 其中options就是編譯器所需要的參數(shù),給出相關(guān)的文件名稱(chēng)2022-3-226GCC常用編譯參數(shù)-c:只編譯,不連接成為可執(zhí)行文件,編

4、譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。-o output_:確定輸出文件的名稱(chēng)為output_,同時(shí)這個(gè)名稱(chēng)不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。-g:產(chǎn)生符號(hào)調(diào)試工具(GNU的gdb)所必要的符號(hào)資訊,要想對(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ì)更慢。2022-3-2

5、27GCC常用編譯參數(shù) -Idirname:將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過(guò)程中使用的參數(shù)。C程序中的頭文件包含兩種情況:A)#include 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)

6、給出搜索路徑。2022-3-228GCC常用編譯參數(shù) -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)要介紹

7、了gcc編譯器最常用的功能和主要參數(shù)選項(xiàng),更為詳盡的資料可以參看Linux系統(tǒng)的聯(lián)機(jī)幫助。2022-3-229GCC應(yīng)用舉例1. gcc hello.c生成a.out2. gcc o hello helo.c生成hello3. gcc O o hello hello.c 生成hello4. gcc O2 o hello hello.c 生成hello5. gcc c hello.c生成hello.o gcc o hello hello.o生成hello6. gcc c hello1.c生成hello1.o gcc c hello2.c生成hello2.o gcc o hello hello1.

8、o hello2.o 生成hello7. gcc o test test1.o lm I/home/czn/include2022-3-2210Make簡(jiǎn)介 在開(kāi)發(fā)大系統(tǒng)時(shí),經(jīng)常要將程序劃分為許多模塊。各個(gè)模塊之間存在著各種各樣的依賴(lài)關(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)在于他只

9、更新修改過(guò)的文件,而對(duì)沒(méi)修改的文件則置之不理,并且make命令不會(huì)漏掉一個(gè)需要更新的文件。2022-3-2211一個(gè)簡(jiǎn)單的例子 先舉一個(gè)例子: a.c b.c兩個(gè)程序a.c extern void p(char *); main() p(hello world); b.c void p(char *str) printf(%sn,str); z Makefile hello: a.c b.c gcc a.c b.c -o hello 注意這里是一個(gè)Tab z 執(zhí)行makegcc a.c b.c -o hello 產(chǎn)生一個(gè)叫hello的可執(zhí)行程序2022-3-2212書(shū)寫(xiě)makefile文件 M

10、akefile時(shí)由規(guī)則來(lái)組成的,每一條規(guī)則都有三部分組成:目標(biāo)(object),依賴(lài)(dependency)和命令(command).在上面的例子中, Makefile只有一條規(guī)則,其目標(biāo)為hello,期依賴(lài)為a.c b.c,其命令為gcc a.c b.c -o hello. 依賴(lài)可以是另一條規(guī)則的目標(biāo),也可以是文件.每一條規(guī)則被這樣處理.如目標(biāo)是一個(gè)文件是:當(dāng)它的依賴(lài)是文件時(shí),如果依賴(lài)的時(shí)間比目標(biāo)要新, 則運(yùn)行規(guī)則所包含的命令來(lái)更新目標(biāo); 如果依賴(lài)是另一個(gè)目標(biāo)則用同樣的方法先來(lái)處理這個(gè)目標(biāo).如目標(biāo)不是一個(gè)存在的文件時(shí),則一定執(zhí)行.2022-3-2213一個(gè)簡(jiǎn)單的makefile文件例如: M

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

12、makefile中引用。宏的定義格式為: 宏名 = 宏的值 (宏名一般習(xí)慣用大寫(xiě)字母)例: CC = gcc hello: a.o b.o $(CC) a.o b.o -o hello a.o: a.c $(CC) c a.c b.o: b.c $(CC) c b.c2022-3-2215系統(tǒng)定義的宏 還有一些設(shè)定好的內(nèi)部變量,它們根據(jù)每一個(gè)規(guī)則內(nèi)容定義。 $ 當(dāng)前規(guī)則的目的文件名 $ 依靠列表中的第一個(gè)依靠文件 $ 整個(gè)依靠的列表(除掉了里面所有重復(fù)的文件名)。 $? 依賴(lài)中所有新于目標(biāo)的 以用變量做許多其它的事情,特別是當(dāng)你把它們和函數(shù)混合 使用的時(shí)候。如果需要更進(jìn)一步的了解,請(qǐng)參考 GN

13、U Make 手冊(cè)。 (man make, man makefile)2022-3-2216修改原先的makefile CC = gcc CFLAGS = -O2 OBJS = a.o b.o hello: $(OBJS)$(CC) $ -o $ a.o: a.c$(CC) $(CFLAGS) -c $ b.o: b.c $(CC) $(CFLAGS) -c $ clean:rm f *.o hello2022-3-2217隱含規(guī)則請(qǐng)注意在上面的例子里,幾個(gè)產(chǎn)生.o文件的命令都是一樣的,都是從.c文件和相關(guān)文件里產(chǎn)生.o文件,這是一個(gè)標(biāo)準(zhǔn)的步驟。其實(shí)make已經(jīng)知道怎么做它有一些叫做隱含規(guī)則的

14、內(nèi)置的規(guī)則,這些規(guī)則告訴它當(dāng)你沒(méi)有給出某些命令的時(shí)候,應(yīng)該怎么辦。如果你把生成a.o和b.o的命令從它們的規(guī)則中刪除,make將會(huì)查找它的隱含規(guī)則,然后會(huì)找到一個(gè)適當(dāng)?shù)拿睢K拿顣?huì)使用一些變量,因此你可以按照你的想法來(lái)設(shè)定它:它使用變量CC做為編譯器,并且傳遞變量CFLAGS,CPPFLAGS,TARGET_ARCH,然后它加入 -c ,后面跟變量$,然后是 -o跟變量$。一個(gè)編譯的具體命令將會(huì)是: $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $當(dāng)然你可以按照你自己的需要來(lái)定義這些變量。2022-3-2218用戶(hù)環(huán)境變量的用戶(hù)環(huán)境變

15、量的設(shè)定設(shè)定2022-3-2219LINUX中BASH環(huán)境變量的設(shè)定順序登錄Linux后,BASH要讀取幾個(gè)文件,這些文件(啟動(dòng)腳本文件)用來(lái)定義BASH環(huán)境,如果希望建立標(biāo)準(zhǔn)的別名,或者希望設(shè)置各種shell變量,就應(yīng)該在bash啟動(dòng)文件中進(jìn)行設(shè)置。和Bash的環(huán)境設(shè)定有關(guān)的文件有(1)/etc/profile (主要) /etc/pro*.sh (主要) (2)$HOME/.bash_profile (主要)(3)$HOME/.bash_login(4)$HOME/.profile $HOME/.bash_logout (主要)(5)$HOME/.bashrc (主要) /etc/bash

16、rc2022-3-2220LINUX中BASH環(huán)境變量的設(shè)定順序 登入(login)交互式時(shí)(從字符終端或X Window登錄)先執(zhí)行 /etc/profile(包括/etc/profile.d/*.sh)2. 接著bash會(huì)檢查使用者的自家目錄中,是否有 .bash_profile 或者 .bash_login或者 .profile,若有,則會(huì)執(zhí)行其中一個(gè),執(zhí)行順序?yàn)椋?.bash_profile 最優(yōu)先 .bash_login其次 .profile 最后 (執(zhí)行最先碰到的一個(gè),前面的設(shè)定會(huì)被后面的覆蓋)3.啟動(dòng)后讀取.bashrc2022-3-2221LINUX中BASH環(huán)境變量的設(shè)定順序

17、非登錄交互式(從其它shell或者bash啟動(dòng)一個(gè)新的 shell )bash 會(huì)檢查使用者的自家目錄中是否有 .bashrc,若有則予以執(zhí)行,這是唯一的啟動(dòng)文件.非交互式(即運(yùn)行SHELL腳本) 上述所有腳本都不執(zhí)行,如果定義了環(huán)境變量ENV,則ENV的值作為啟動(dòng)腳本文件名首先執(zhí)行。在前兩種情況下,如果定義了環(huán)境變量ENV,則首先讀取ENV指定的文件,然后按順序讀取前述腳本文件。登出(exit/logout)時(shí) bash會(huì)檢查使用者自家目錄中是否有 .bash_logout,若有,則bash會(huì)執(zhí)行其中的指令2022-3-2222LINUX中BASH環(huán)境變量的設(shè)定順序 各文件用途說(shuō)明/etc/

18、profile 由 root 所控制, 用來(lái)設(shè)定適合全體使用者的shell環(huán)境 2. 若使用者自己覺(jué)得 /etc/profile 的設(shè)定, 并不合意, 可以修改自家目錄中的 .bash_profile 3. .bash_login 及 .profile 是為了方便那些從 Bourne shell 移轉(zhuǎn)過(guò)來(lái)的用戶(hù), 只要將 Bourne shell 主要的啟動(dòng)檔 .profile 移到自家目錄中, 放棄使用 .bash_profile 及 .bash_login 即可繼續(xù)沿用以前的設(shè)定環(huán)境 2022-3-2223LINUX中BASH環(huán)境變量的設(shè)定順序 各文件用途說(shuō)明4. .bashrc 則是用來(lái)

19、設(shè)定 subshell 的環(huán)境的, 之所以要有這個(gè) .bashrc 是為避免 subshell產(chǎn)生時(shí), 又重覆將 /etc/profile 執(zhí)行一次. 我們發(fā)現(xiàn) .bashrc 中已預(yù)先會(huì)去執(zhí)行 /etc/bashrc的指令, 這表示, 或許 root 會(huì)將產(chǎn)生 subshell 時(shí)的環(huán)境設(shè)好了,使用者只要沿用 /etc/bashrc的內(nèi)容, 應(yīng)該不會(huì)有任何問(wèn)題. 5. .bash_logout 是使用者登出主機(jī)之前, 會(huì)去執(zhí)行的設(shè)定檔, 如果使用者希望在他登出系統(tǒng)之后, 能幫他自動(dòng)處理一些瑣事, 比如: 清除臨時(shí)文件, 清除屏幕等, 可以在這個(gè)檔案中加以設(shè)定. 2022-3-2224使用庫(kù)使

20、用庫(kù)2022-3-2225使用編程庫(kù)u編程庫(kù)兩個(gè)主要優(yōu)點(diǎn) 實(shí)現(xiàn)代碼重用 提供數(shù)百行經(jīng)過(guò)測(cè)試和調(diào)試的工具代碼u命名和編號(hào)約定 以lib開(kāi)頭 (gcc會(huì)在-l選項(xiàng)所指定的文件名前自動(dòng)插入lib) 文件名以.a(archive)結(jié)尾的庫(kù)都是靜態(tài)庫(kù) 文件名以.so(shared object)結(jié)尾的庫(kù)都是共享庫(kù) 如libdl.a是一個(gè)靜態(tài)庫(kù)而libc.so是一個(gè)共享庫(kù)2022-3-2226使用編程庫(kù)u編號(hào)約定 一般格式為library_name.major_num.minor_num.patch_num 如libgdbm.so.2.0.0, library_name為libgdbm.so,major_

21、num是2,minor_num是0,patch_num是0 當(dāng)庫(kù)有新的變化和以前不能兼容時(shí)需要增加major_num 當(dāng)庫(kù)有新的變化又能和以前版本兼容時(shí)只改變minor_num 為修正庫(kù)中錯(cuò)誤進(jìn)行的改動(dòng)只會(huì)改變patch_numu兩類(lèi)特殊的庫(kù) 以_g結(jié)尾的庫(kù)(調(diào)試庫(kù)) 以_p結(jié)尾的庫(kù)(代碼剖析庫(kù)profiling) 如libform_g.a和libform_p.a,他們是基本庫(kù)libform.a的特殊版本2022-3-2227庫(kù)操作工具unm 命令nm列出編入目標(biāo)文件或者二進(jìn)制文件的所有符號(hào) 可以查看程序調(diào)用了什么函數(shù) 或者查看給定的庫(kù)或者目標(biāo)文件是否提供了所需的函數(shù) nm options f

22、ile 常用options: -c|-demangle 將符號(hào)名轉(zhuǎn)換為用戶(hù)級(jí)的名字,在讓C+函數(shù)名可讀方面特別有用 -s|-print-armap 當(dāng)用于.a文件時(shí),輸出把符號(hào)名映射到定義該符號(hào)的模塊或成員名的索引 -u |-undefined-only 只顯示未定義的符號(hào)(在被檢查的文件外部定義的符號(hào))2022-3-2228庫(kù)操作工具uar 用來(lái)操縱高度結(jié)構(gòu)化的庫(kù)文件(靜態(tài)庫(kù)),最常用來(lái)創(chuàng)建靜態(tài)庫(kù) 創(chuàng)建和維護(hù)符號(hào)名的交叉索引表,如函數(shù)和變量名到定義它們的成員之間的交叉索引表 ar dmpqrtx member archive files . 常用選項(xiàng) c -s -r q -r: 向存檔文件插

23、入files,替換已有的任何同名成員。新成員添加到存檔文件的末尾。 -s:創(chuàng)建或升級(jí)從符號(hào)到定義他們的成員之間的交叉索引映射表 ranlib v file等價(jià)于 ar s file2022-3-2229庫(kù)操作工具uldd ldd命令列出為使程序正常運(yùn)行所需的共享庫(kù) 用法 ldd options file 常用選項(xiàng): -d 執(zhí)行重定位并報(bào)告所有丟失的函數(shù) -r 執(zhí)行對(duì)函數(shù)和數(shù)據(jù)對(duì)象的重定位并報(bào)告丟失的任何函數(shù)或數(shù)據(jù)對(duì)象。2022-3-2230庫(kù)操作工具uldconfig 用法 ldconfig options libs ldconfig決定位于目錄/usr/lib(lib64)和/lib(lib

24、64)下的共享庫(kù)所需的運(yùn)行的鏈接,這些鏈接在命令行上的庫(kù)被保存在/etc/ld.so.conf中 常用選項(xiàng) -p 僅打印出文件/etc/ld.so.cache的內(nèi)容,此文件是ld.so所知道的共享庫(kù)的當(dāng)前列表 -v 更新/etc/ld.so.cache的內(nèi)容,列出每個(gè)庫(kù)的版本號(hào),掃描的目錄和所有創(chuàng)建和更新的鏈接。2022-3-2231環(huán)境變量和配置文件u動(dòng)態(tài)鏈接器/加載器ld.so使用的兩個(gè)環(huán)境變量 $LD_LIBRARY_PATH一個(gè)由冒號(hào)分割的目錄清單,在這些目錄 下可以搜索運(yùn)行時(shí)的共享庫(kù) 可以用這個(gè)環(huán)境變量告訴ld.so在哪兒找到?jīng)]有保存在標(biāo)準(zhǔn)位置的庫(kù);這點(diǎn)跟$PATH類(lèi)似 第二個(gè)環(huán)境變量是$LD_PRELOAD,一個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論