《unixos教學(xué)課件》第六章unix系統(tǒng)編程基礎(chǔ)automake_第1頁
《unixos教學(xué)課件》第六章unix系統(tǒng)編程基礎(chǔ)automake_第2頁
《unixos教學(xué)課件》第六章unix系統(tǒng)編程基礎(chǔ)automake_第3頁
《unixos教學(xué)課件》第六章unix系統(tǒng)編程基礎(chǔ)automake_第4頁
《unixos教學(xué)課件》第六章unix系統(tǒng)編程基礎(chǔ)automake_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章 Unix系統(tǒng)編程基礎(chǔ)理解:程序設(shè)計環(huán)境(用戶空間和系統(tǒng)空間)理解:基于操作系統(tǒng)的程序設(shè)計(系統(tǒng)調(diào)用)掌握: C/C+編輯器 GCC掌握: GNU make和makefile的編寫規(guī)則掌握 :C/C+調(diào)試器 GDB了解:常用系統(tǒng)調(diào)用及庫函數(shù)的使用方法了解:常用函數(shù)庫glib的使用了解:程序管理軟件SCCSCVS第1頁,共49頁。6.1 程序設(shè)計環(huán)境理想的程序設(shè)計環(huán)境單任務(wù)環(huán)境-單用戶、單進(jìn)程多任務(wù)環(huán)境下的程序設(shè)計用戶程序不能直接控制系統(tǒng)的硬件設(shè)備用戶程序通過操作系統(tǒng)來控制系統(tǒng)的資源存儲中存在:用戶程序空間和系統(tǒng)空間程序程序程序系統(tǒng)核心空間(內(nèi)核)第2頁,共49頁。6.2 基于操作系統(tǒng)支持

2、的程序設(shè)計建立系統(tǒng)編程的思想站在資源管理者的角度來分析問題,充分考慮系統(tǒng)為用戶程序提供哪些服務(wù)和資源,以實現(xiàn)對系統(tǒng)資源的有效利用嵌入式系統(tǒng)系統(tǒng)調(diào)用用戶程序通過系統(tǒng)調(diào)用實現(xiàn)對系統(tǒng)內(nèi)核功能的使用及對各種硬件資源的訪問了解:系統(tǒng)調(diào)用的使用方法輸入、輸出控制類進(jìn)程、線程管理類:創(chuàng)建、終止、同步、互斥等內(nèi)存及輔存管理類第3頁,共49頁。6.2 基于操作系統(tǒng)支持的程序設(shè)計設(shè)備控制類本地進(jìn)程通信管理類網(wǎng)絡(luò)進(jìn)程通信管理類系統(tǒng)調(diào)用與庫函數(shù)的關(guān)系系統(tǒng)調(diào)用是操作系統(tǒng)層面提供的服務(wù),庫函數(shù)是高級語言提供的服務(wù)用戶程序庫函數(shù)用戶程序系統(tǒng)調(diào)用第4頁,共49頁。6.3 在UNIX中完成C程序開發(fā)編程語言低級語言機器語言:

3、能夠由機器直接執(zhí)行。匯編語言: 包含一些助記符,需要由匯編程序?qū)⑵浞g成機器語言。高級語言:需要由編譯程序和解釋語言將其翻譯成機器語言COBOL、BASIC、C/C+、PASCAL、FORTRAN、JAVA第5頁,共49頁。6.3 在UNIX中完成C程序開發(fā)建立可執(zhí)行程序的步驟建立源文件建立目標(biāo)文件建立可執(zhí)行文件源代碼目標(biāo)代碼:由編譯程序和解釋程序把源代碼翻譯成機器能夠理解的語言。目標(biāo)代碼不是可執(zhí)行文件,它還缺少庫文件??蓤?zhí)行代碼可能包含其它程序代碼,由鏈接程序?qū)⒛繕?biāo)代碼和其它程序代碼鏈接在一起,形成完整的可執(zhí)行程序庫文件指的是為用戶程序和操作系統(tǒng)之間提供接口的程序第6頁,共49頁。6.3 在

4、UNIX中完成C程序開發(fā)區(qū)別編譯程序和解釋程序編譯程序:把高級語言翻譯成機器語言。它一次編譯所有的程序代碼,在編譯完成之前沒有任何結(jié)果反饋;解釋程序:把高級語言翻譯成機器語言。它一次翻譯一行代碼,并立即將執(zhí)行結(jié)果反饋。 編譯程序產(chǎn)生更好且效率更高的目標(biāo)代碼; 解釋程序在每次執(zhí)行時都會重新解釋源代碼,效率較低Linux中的C/C+編譯程序是GCCLinux中的SHELL解釋程序是BASH第7頁,共49頁。6.3.1 GCC:C/C+ 編譯器GCC(GNU C Compiler)是GNU推出的功能強大、性能優(yōu)越的多平臺編譯器,gcc編譯器能將C、C+語言源程序、匯編語言和目標(biāo)程序編譯、鏈接成可執(zhí)行

5、文件,以下是gcc支持編譯的一些源文件的后綴及其解釋(點擊)使用gcc將C源代碼文件生成可執(zhí)行文件,需要經(jīng)歷4個相關(guān)的步驟:預(yù)處理,編譯,匯編,鏈接預(yù)處理鏈接編譯組譯源程序(*.c)可執(zhí)行文件預(yù)處理器編譯器組譯器鏈接器第8頁,共49頁。gcc支持編譯的源文件后綴第9頁,共49頁。GCC的使用方法gcc的基本用法:gcc 選項 文件名列表gcc的選項說明:-c只編譯并生成目標(biāo)文件(.o)-g生成調(diào)試信息-o file指定生成的文件名這里的文件名列表指的是需要編譯和鏈接的文件,例如C, C+源文件,目標(biāo)文件,匯編程序代碼等。gcc的選項非常多,可以使用man gcc來查看,我們經(jīng)常使用的選項是 -

6、c -g -o第10頁,共49頁。gcc命令的常用選項第11頁,共49頁。幾個簡單的C程序?qū)嵗齢ello.cgcc -o hello hello.c./hello計算階乘的程序?qū)⒍鄠€源程序編譯成一個可執(zhí)行文件gcc -o factorial factorial_main.c factorial.c./ factorial n編譯一個C+程序GCC編譯器可通過后綴名判斷c(.c)或c+程序(.C/.cpp),使用g+進(jìn)行編譯g+ -o hello_C hello.cpp第12頁,共49頁。改正錯誤及重定向標(biāo)準(zhǔn)錯誤如果源程序有誤,希望將錯誤信息重定向到某個文件,以便于逐一糾錯,可使用如下語句gcc

7、 hello_error.c -o hello_error 2error重定向標(biāo)準(zhǔn)錯誤1 file: 標(biāo)準(zhǔn)輸出設(shè)備的重定向2 file: 標(biāo)準(zhǔn)錯誤輸出的重定向rootstu1 no10# cat errorhello_error.c: In function main:hello_error.c:9: syntax error before printf第13頁,共49頁。6.3.2 GNU make和makefile文件GNU make makefile 基本結(jié)構(gòu) makefile 變量 GNU make 的主要預(yù)定義變量 隱含規(guī)則 makefile 范例 運行 make第14頁,共49頁。

8、GNU make利用 make 工具來自動完成編譯工作。這些工作包括:如果僅修改了某幾個源文件,則只重新編譯這幾個源文件;如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這種自動編譯可大大簡化開發(fā)工作,避免不必要的重新編譯。make 工具通過一個稱為 makefile 的文件來完成并自動維護(hù)編譯工作。makefile 需要按照某種語法進(jìn)行編寫,其中說明了如何編譯各個源文件并鏈接生成可執(zhí)行文件,并定義了源文件之間的依賴關(guān)系。 當(dāng)修改了其中某個源文件時,如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。第15頁,共49頁。GNU make默認(rèn)情況下,GNU make

9、 工具在當(dāng)前工作目錄中按如下順序搜索 makefileGNU makefilemakefileMakefile在 UNIX 系統(tǒng)中,習(xí)慣使用 Makefile作為 makefile文件。如果要使用其他文件作為 makefile,則可利用類似下面的 make 命令選項指定 makefile 文件: make -f Makefile.debug第16頁,共49頁。makefile的基本結(jié)構(gòu)makefile 中一般包含如下內(nèi)容:需要由 make工具創(chuàng)建的項目,通常是目標(biāo)文件和可執(zhí)行文件。通常使用“目標(biāo)(target)”一詞來表示要創(chuàng)建的項目。要創(chuàng)建的項目依賴于哪些文件;創(chuàng)建每個項目時需要運行的命令;

10、例子:假設(shè)你現(xiàn)在有一個 C+ 源文件 test.C,該源文件包含有自定義的頭文件 test.h,則目標(biāo)文件 test.o 明確依賴于兩個源文件:test.C 和 test.h。另外你可能只希望利用 g+ 命令來生成 test.o 目標(biāo)文件。 這時就可以利用如下的 makefile 來定義 test.o 的創(chuàng)建規(guī)則 第17頁,共49頁。Makefile基本結(jié)構(gòu)實例1演示:例1當(dāng) test.C 或 test.h 文件在編譯之后又被修改,則 make 工具可自動重新編譯 test.o,如果在前后兩次編譯之間,test.C 和 test.h 均沒有被修改,而且 test.o 還存在的話,就沒有必要重新

11、編譯。test.o: test.C test.h g+ -c -g test.C指定 test.o 為目標(biāo)依賴文件指定了如何從目標(biāo)所依賴的文件建立目標(biāo)第18頁,共49頁。Makefile基本結(jié)構(gòu)一個 makefile 文件中可定義多個目標(biāo),利用 make target 命令可指定要編譯的目標(biāo),如果不指定目標(biāo), 則使用第一個目標(biāo)。通常,makefile 中定義有 clean 目標(biāo),可用來清除編譯過程中的中間文件,例如: clean: rm -f *.o 運行 make clean 時,將執(zhí)行 rm -f *.o 命令,最終刪除所有編譯過程中產(chǎn)生的所有中間文件。第19頁,共49頁。makefile

12、 實例2 Network: Subrs.o network.o gcc -o Network Subrs.o network.oSubrs.o: Subrs.c Netdefs.h gcc -c Setwork.o: network.c Netdefs.h gcc -c network.cclean: rm -f *.o演示:例2第20頁,共49頁。Makefile變量GNU 的 make 工具除提供有建立目標(biāo)的基本功能之外,還有許多便于表達(dá)依賴性關(guān)系以及建立目標(biāo)的命令的特色。其中之一就是變量或宏的定義能力。如果你要以相同的編譯選項同時編譯十幾個 C 源文件,而為每個目 標(biāo)的編譯指定冗長的編譯

13、選項的話,將是非常乏味的。但利用簡單的變量定義,可避免這種乏味的工作# Define macros for name of compiler CC = gcc # Define a macro for the CC flags CFLAGS = -c -g # A rule for building a object file test.o: test.c test.h $(CC) $(CFLAGS) test.c 第21頁,共49頁。GNU make 的主要預(yù)定義變量GNU make 有許多預(yù)定義的變量,這些變量具有特殊的含義,可在規(guī)則中使用。表 1-5 給出了一些主要的 預(yù)定義變量,除這些

14、變量外,GNU make 還將所有的環(huán)境變量作為自己的預(yù)定義變量。 第22頁,共49頁。GNU make 的主要預(yù)定義變量第23頁,共49頁。隱含規(guī)則 (1)GNU make包含有一些內(nèi)置的或隱含的規(guī)則,這些規(guī)則定義了如何從不同的依賴文件建立特定類型的目標(biāo)。 GNU make 支持兩種類型的隱含規(guī)則:后綴規(guī)則(Suffix Rule):后綴規(guī)則是定義隱含規(guī)則的老風(fēng)格方法。后綴規(guī)則定義了將一個具有某個后綴的文件(例如,.c 文件)轉(zhuǎn)換為具有另外一種后綴的文件(例如,.o 文件)的方法。每個后綴規(guī)則以兩個成對出現(xiàn)的后綴名定義,例如,將 .c 文件轉(zhuǎn)換為 .o 文件的后綴規(guī)則可定義為: .c .o:

15、 $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $ 第24頁,共49頁。隱含規(guī)則 (2)模式規(guī)則(pattern rules):這種規(guī)則更加通用,因為可以利用模式規(guī)則定義更加復(fù)雜的依賴性規(guī)則。 模式規(guī)則看起來非常類似于正則規(guī)則,但在目標(biāo)名稱的前面多了一個 % 號,同時可用來定義目標(biāo)和依賴 文件之間的關(guān)系,例如下面的模式規(guī)則定義了如何將任意一個 x.c 文件轉(zhuǎn)換為 x.o 文件: %.c:%.o $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $ 第25頁,共49頁。make 運行GNU make 命令還有一些其他選項第26頁,共49頁。make

16、file 范例根據(jù)圖示依賴關(guān)系編寫一個makefile文件,依賴關(guān)系圖如下:演示:例3第27頁,共49頁。make的實例ns.exe: link.o node.o ns.ogcc -o ns.exe link.o node.o ns.olink.o: link.c link.h.config.hgcc -c ode.o: node.c node.h config.hgcc -c s.o: ns.c ns.h config.hgcc -c ns.cclean:rm -f *.o第28頁,共49頁。使用automake和autoconf產(chǎn)生makefile在開始使用automake和autocon

17、f之前,請先確認(rèn)系統(tǒng)已經(jīng)安裝以下的軟件:GNU automakeGNU autoconfGNU m4PerlGNU Libtool (如果你需要產(chǎn)生shared library)automake 所產(chǎn)生的 makefile 除了可以做到程序的編譯和鏈接,也已經(jīng)把如何產(chǎn)生程序文件的操作,以及把安裝程序都考慮進(jìn)去了,所以源程序所存放的目錄架構(gòu)最好符合GNU的標(biāo)準(zhǔn)慣例,下面用hello.c來作為例子進(jìn)行說明。第29頁,共49頁。使用automake和autoconf產(chǎn)生makefile在工作目錄下建立一個新的子目錄4,再在4下建立一個hello的子目錄,這個目錄將作為存放 hello 這個程序及其相

18、關(guān)文件的地方:#include int main(int argc, char* argv) printf(Hello, GNU!n); return 0;演示:例4第30頁,共49頁。使用automake和autoconf產(chǎn)生makefile具體步驟執(zhí)行autoscan命令生成configure.scan 編輯修改configure.scan文件,并且把文件名改成configure.in autoscan的作用在于掃描源代碼以搜尋普通的可移植性問題,比如檢查編譯器,庫,頭文件等configure.in里的內(nèi)容是一些宏定義,目的是為了檢測程序運行所需要的一些參數(shù)或環(huán)境變量等第31頁,共49頁。

19、使用automake和autoconf產(chǎn)生makefile修改configure.in文件,最主要的是手動添加AM_INIT_AUTOMAKE宏,并修改AC_OUTPUT指定Makefile文件的生成位置第32頁,共49頁。使用automake和autoconf產(chǎn)生makefile執(zhí)行aclocal命令生成aclocal.m4文件執(zhí)行autoheader命令,通過configuer.in中的某些宏運行上一步生成的m4文件,生成config.h.inaclocal.m4是一個perl腳本程序執(zhí)行autoconf生成configure腳本 新建并編輯Makefile.am文件configure是一

20、套配置軟件源代碼的腳本。autoconf命令依據(jù)configure.in文件來生成configure腳本,途中利用了aclocal.m4文件Makefile.am文件中定義的宏和目標(biāo),會指導(dǎo)automake生成指定的代碼第33頁,共49頁。使用automake和autoconf產(chǎn)生makefile執(zhí)行automake -add-missing命令生成Makefile.in文件新建Makefile.am文件,指定生成的可執(zhí)行文件和源文件之后通過autoconf生成的configure腳本,配合automake生成的Makefile.in文件,就可以產(chǎn)生一份符合GNU Makefile慣例的Mak

21、efile第34頁,共49頁。使用automake和autoconf產(chǎn)生makefile最后執(zhí)行 ./configure :現(xiàn)在你的目錄下已經(jīng)產(chǎn)生了一個Makefile文件,執(zhí)行make命令就可以開始編譯hello.c 成執(zhí)行文件,最后執(zhí)行./hello:# makegcc -DPACKAGE=hello -DVERSION=1.0 -I. -I. -g -O2 -c hello.cgcc -g -O2 -o hello hello.o# ./helloHello! GNU!第35頁,共49頁。6.3.3 GDB :Linux調(diào)試工具Linux系統(tǒng)中包含了GNU 調(diào)試程序gdb,它是一個用來調(diào)

22、試C和 C+ 程序的調(diào)試器??梢允钩绦蜷_發(fā)者在程序運行時觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況。gdb所提供的一些功能如下所示:運行程序,設(shè)置所有的能影響程序運行的參數(shù)和環(huán)境;控制程序在指定的條件下停止運行;當(dāng)程序停止時,可以檢查程序的狀態(tài);修改程序的錯誤,并重新運行程序; 動態(tài)監(jiān)視程序中變量的值; 可以單步執(zhí)行代碼,觀察程序的運行狀態(tài)。 第36頁,共49頁。GDB調(diào)試說明gdb程序調(diào)試的對象是可執(zhí)行文件,而不是程序的源代碼文件。如果要讓產(chǎn)生的可執(zhí)行文件可以用來調(diào)試,需在執(zhí)行g(shù)cc指令編譯程序時,加上-g參數(shù),指定程序在編譯時包含調(diào)試信息。調(diào)試信息包含程序里的每個變量的類型和在可執(zhí)行文件里的地址映

23、射以及源代碼的行號。gdb 利用這些信息使源代碼和機器碼相關(guān)聯(lián)??稍?makefile 中如下定義 CFLAGS 變量: CFLAGS = -g rootstu1 no10# gcc -g hello_error.c -o hello_error rootstu1 no10# gdb第37頁,共49頁。GDB的幫助在 gdb 提示符處鍵入help,將列出命令的分類,鍵入 help 后跟命令的分類名,可獲得該類命令的詳細(xì)清單。 如果想要了解某個具體命令(比如break)的幫助信息,在gdb提 示符下輸入下面的命令:help breakbreak的作用是設(shè)置斷點aliases:命令別名breakp

24、oints:斷點定義data:數(shù)據(jù)查看iles:指定并查看文件internals:維護(hù)命令running:程序執(zhí)行stack:調(diào)用棧查看statu:狀態(tài)查看tracepoints:跟蹤程序執(zhí)行。另一個獲得gdb幫助的方法是瀏覽gdb的手冊頁。# man gdb第38頁,共49頁。GDB的常用命令gdb的基本命令gdb filename其中filename是要調(diào)試的可執(zhí)行文件。用這種方式運行g(shù)db可以直接指定想要調(diào)試的程序。這和啟動gdb后執(zhí)行file filename命令效果完全一樣。gdb支持很多的命令且能實現(xiàn)不同的功能。這些命令從簡單的文件裝入到允許你檢查所調(diào)用的堆棧內(nèi)容的復(fù)雜命令,下面列

25、出了在使用gdb 調(diào)試時會用到的一些命令。file命令:裝入想要調(diào)試的可執(zhí)行文件cd命令:改變工作目錄第39頁,共49頁。gdb 常用命令pwd命令:打印當(dāng)前工作日錄。 run命令:執(zhí)行當(dāng)前被調(diào)試的程序。 list命令:列出正在調(diào)試的應(yīng)用程序的源代碼。 break命令:設(shè)置斷點。 kill命令:停止正在調(diào)試的應(yīng)用程序。tbreak命令;設(shè)置臨時斷點。它的語法與break相同。區(qū)別在于用tbreak設(shè)置的斷點執(zhí)行一次之后立即消失。watch命令:設(shè)置監(jiān)視點,監(jiān)視表達(dá)式的變化。continue命令: 繼續(xù)正在執(zhí)行調(diào)試的程序。該命令用在程序由于處理信號或斷點而導(dǎo)致停止運行的情況。第40頁,共49頁。

26、gdb 常用命令awatch命令:設(shè)置讀寫監(jiān)視點。當(dāng)要監(jiān)視的表達(dá)式被讀或?qū)憰r將應(yīng)用程序掛起。它的語法與watch命令相同。rwatch命令:設(shè)置讀監(jiān)視點,當(dāng)監(jiān)視表達(dá)式被讀時將程序掛起,等侍調(diào)試。此命令的語法與watch相同。next命令:執(zhí)行下一條源代碼,但是不進(jìn)入函數(shù)內(nèi)部。也就是說,將一條函數(shù)調(diào)用作為一條語句執(zhí)行。執(zhí)行這個命令的前提是已經(jīng)run,開始了代碼的執(zhí)行。 第41頁,共49頁。gdb 常用命令step命令:執(zhí)行下一條源代碼,進(jìn)入函數(shù)內(nèi)部。如果調(diào)用了某個函數(shù),會跳到函數(shù)所在的代碼中等候一步步執(zhí)行。執(zhí)行這個命令的前提是已經(jīng)用run開始執(zhí)行代碼。display命令:在應(yīng)用程序每次停止運行時

27、顯示表達(dá)式的值。info break命令:顯示當(dāng)前斷點列表,包括每個斷點到達(dá)的次數(shù)info files命令:顯示調(diào)試文件的信息。 info func命令:顯示所有的函數(shù)名。 第42頁,共49頁。gdb 常用命令info local命令:顯示當(dāng)前函數(shù)的所有局部變量的信息。 info prog命令:顯示調(diào)試程序的執(zhí)行狀態(tài)。print命令;顯示表達(dá)式的值。 delete命令:刪除斷點。指定一個斷點號碼,則刪除指定斷點。不指定參數(shù)則刪除所有的斷點。 Shell命令:執(zhí)行Linux Shell命令。 make命令:不退出gdb而重新編譯生成可執(zhí)行文件。 quit命令:退出gdb。第43頁,共49頁。GDB的簡單實例#include static char buff256;static char *string;int main() printf(please input a string:n); gets(string); prin

溫馨提示

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

最新文檔

評論

0/150

提交評論