第九章_Linux下的C和C++編程_第1頁
第九章_Linux下的C和C++編程_第2頁
第九章_Linux下的C和C++編程_第3頁
第九章_Linux下的C和C++編程_第4頁
第九章_Linux下的C和C++編程_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第九章第九章 Linux下的下的C和和C+編程編程2/48目錄目錄引言引言C語言編譯器語言編譯器GCC程序維護(hù)工具程序維護(hù)工具make小結(jié)小結(jié)3/48引言引言Linux軟件開發(fā)一直在軟件開發(fā)一直在Internet環(huán)境下進(jìn)行。這個(gè)環(huán)環(huán)境下進(jìn)行。這個(gè)環(huán)境是全球性的,編程人員來自世界各地。境是全球性的,編程人員來自世界各地。Linux開發(fā)開發(fā)工作經(jīng)常是在工作經(jīng)常是在Linux用戶決定共同完成一個(gè)項(xiàng)目時(shí)開用戶決定共同完成一個(gè)項(xiàng)目時(shí)開始的。當(dāng)開發(fā)工作完成后,該軟件就被放到始的。當(dāng)開發(fā)工作完成后,該軟件就被放到Internet站點(diǎn)上,任何用戶都可以訪問和下載它。由于這個(gè)站點(diǎn)上,任何用戶都可以訪問和下載它。

2、由于這個(gè)活躍的開發(fā)環(huán)境,新的以活躍的開發(fā)環(huán)境,新的以Linux為基礎(chǔ)的軟件功能日為基礎(chǔ)的軟件功能日益強(qiáng)大,且呈爆炸式的增長態(tài)勢。益強(qiáng)大,且呈爆炸式的增長態(tài)勢。大多數(shù)大多數(shù)Linux軟件是經(jīng)過自由軟件基金會軟件是經(jīng)過自由軟件基金會(Free Software Foundation)提供的提供的GNU(GNU即即GNUs not UNIX)公開認(rèn)證授權(quán)的,因而通常被稱作公開認(rèn)證授權(quán)的,因而通常被稱作GNU軟件。軟件。GNU軟件免費(fèi)提供給用戶使用,并被證明是軟件免費(fèi)提供給用戶使用,并被證明是非常可靠和高效的。許多流行的非??煽亢透咝У?。許多流行的Linux實(shí)用程序,如實(shí)用程序,如C編譯器、編譯器、s

3、hell和編輯器都是和編輯器都是GNU軟件應(yīng)用程序。軟件應(yīng)用程序。4/48引言引言需要需要 C 語言嗎?語言嗎?lShell 夠用嗎?夠用嗎?腳本語言是一種解釋性語言,用戶輸入只有當(dāng)執(zhí)行腳本語言是一種解釋性語言,用戶輸入只有當(dāng)執(zhí)行腳本后才被識別和執(zhí)行。解釋性語言在每次執(zhí)行腳腳本后才被識別和執(zhí)行。解釋性語言在每次執(zhí)行腳本時(shí)必須重新解釋,效率低下,也不適合于直接操本時(shí)必須重新解釋,效率低下,也不適合于直接操作計(jì)算機(jī)的作計(jì)算機(jī)的RAM和和I/O設(shè)備。設(shè)備。lLinux和和C語言關(guān)聯(lián)?語言關(guān)聯(lián)?Shell命令和命令和Linux內(nèi)核都是用內(nèi)核都是用C和和C+編寫而成的。編寫而成的。5/48引言引言l本節(jié)

4、學(xué)習(xí)主要內(nèi)容:本節(jié)學(xué)習(xí)主要內(nèi)容:l如何在如何在Linux下安裝和使用下安裝和使用GUN C的編譯器的編譯器GCClMake程序維護(hù)工具程序維護(hù)工具6/489.1 C語言編譯器語言編譯器GCCGCC 的安裝的安裝使用使用 GCC 編譯器編譯器編譯程序編譯程序函數(shù)庫函數(shù)庫調(diào)試器調(diào)試器7/489.1 C語言編譯器語言編譯器GCC在在 Linux 開發(fā)環(huán)境下,最常用的開發(fā)環(huán)境下,最常用的 C/C+ 語言編譯語言編譯器器GCC(GNU C Compile)的縮寫,它是的縮寫,它是GNU/Linux 系統(tǒng)下的標(biāo)準(zhǔn)系統(tǒng)下的標(biāo)準(zhǔn) C 編譯器。編譯器。目前,目前,GCC可以支持多種高級語言,如可以支持多種高級語

5、言,如lC/C+lObject ClJAVAlFortranlPASCALlADA等等l還可根據(jù)需要選擇安裝支持的語言。還可根據(jù)需要選擇安裝支持的語言。8/489.1 C語言編譯器語言編譯器GCCgcc 可以使程序員靈活地控制編譯過程??梢允钩绦騿T靈活地控制編譯過程。編譯過程編譯過程一般可以分為下面四個(gè)階段,每個(gè)階段分別調(diào)用不一般可以分為下面四個(gè)階段,每個(gè)階段分別調(diào)用不同的工具進(jìn)行處理,如下圖所示。同的工具進(jìn)行處理,如下圖所示。預(yù)預(yù)處處理理鏈鏈接接編編譯譯組組譯譯源程序源程序(*.c)可執(zhí)行可執(zhí)行文件文件預(yù)處預(yù)處理器理器編編譯譯器器組組譯譯器器連連接接器器9.1 C語言編譯器語言編譯器GCCG

6、CC編譯分為四個(gè)步驟:編譯分為四個(gè)步驟:l預(yù)處理預(yù)處理 GCC調(diào)用調(diào)用cpp程序進(jìn)行預(yù)處理,即分析像程序進(jìn)行預(yù)處理,即分析像#include、#define之類的命令。之類的命令。l編譯編譯 GCC是調(diào)用是調(diào)用ccl程序進(jìn)行編譯的,它根據(jù)源代碼生成匯編語程序進(jìn)行編譯的,它根據(jù)源代碼生成匯編語言。言。l匯編匯編 GCC調(diào)用調(diào)用as程序?qū)⑸弦徊降慕Y(jié)果生成擴(kuò)展名為程序?qū)⑸弦徊降慕Y(jié)果生成擴(kuò)展名為o的目標(biāo)文件的目標(biāo)文件l連接連接 GCC調(diào)用調(diào)用ld程序?qū)⒛繕?biāo)文件進(jìn)行連接,最后生成可執(zhí)行文件。程序?qū)⒛繕?biāo)文件進(jìn)行連接,最后生成可執(zhí)行文件。9/4810/489.1 C語言編譯器語言編譯器GCCgcc 的版本信

7、息的版本信息 一般來說,系統(tǒng)安裝后就已經(jīng)安裝和設(shè)定好了一般來說,系統(tǒng)安裝后就已經(jīng)安裝和設(shè)定好了gcc。在在 shell 的提示符下鍵入的提示符下鍵入 gcc -v,屏幕上就會顯示出,屏幕上就會顯示出目前正在使用的目前正在使用的 gcc 的版本。的版本。11/489.1 C語言編譯器語言編譯器GCCGCC 的安裝的安裝lsudo apt-get install build-essential12/489.1 C語言編譯器語言編譯器GCC9.1.2 使用使用 GCC 編譯器編譯器l通常后跟一些選項(xiàng)和文件名來使用通常后跟一些選項(xiàng)和文件名來使用 GCC 編譯器,編譯器,gcc 命令的基本用法如下:命令

8、的基本用法如下:gcc option | filename g+ option | filename l其中其中 option 為為 gcc 使用時(shí)的選項(xiàng),而使用時(shí)的選項(xiàng),而 filename 為為gcc 要處理的文件(課本要處理的文件(課本page.215)C程序:程序:p3.1.c#include #define MIN(A,B) (A)(B)?(B):(A)int main(void)int a;a=MIN(1,2);printf(The result is:%dn,a);return 0;13/4814/4815/4816/48C+程序:程序:p3.2.cxx#include #def

9、ine MIN(A,B) (A)(B)?(B):(A)int main(void)int a;a=MIN(1,2);std:The result is:astd:end;return 0;17/4818/48使用使用GCC控制編譯過程控制編譯過程預(yù)處理:該步驟完成宏和預(yù)處理:該步驟完成宏和include的處理。的處理。打開打開p3.1.pre.c文件,可以發(fā)現(xiàn)處理在開文件,可以發(fā)現(xiàn)處理在開頭加入了許多函數(shù)聲明外,頭加入了許多函數(shù)聲明外,MIN(A,B)宏在代碼中也被展開。宏在代碼中也被展開。19/48使用使用GCC控制編譯過程控制編譯過程生成匯編代碼:該步驟將預(yù)處理生成的代碼進(jìn)行處理,并根據(jù)生

10、成匯編代碼:該步驟將預(yù)處理生成的代碼進(jìn)行處理,并根據(jù)編程參數(shù)進(jìn)行優(yōu)化,最后生成匯編語言。編程參數(shù)進(jìn)行優(yōu)化,最后生成匯編語言。20/48使用使用GCC控制編譯過程控制編譯過程生成目標(biāo)代碼:該步驟把中間代碼變成特定機(jī)器上的指令代碼。生成目標(biāo)代碼:該步驟把中間代碼變成特定機(jī)器上的指令代碼。21/48使用使用GCC控制編譯過程控制編譯過程鏈接生成可執(zhí)行代碼。鏈接生成可執(zhí)行代碼。22/4823/489.1 C語言編譯器語言編譯器GCCl編譯編譯 main.c 和和 factorial.c 這兩個(gè)源文件。這兩個(gè)源文件。/ factorial.c #include int factorial(int n)

11、if (n=1) return 1; else return factorial(n-1)*n; 24/489.1 C語言編譯器語言編譯器GCC/main.c #include int factorial(int n); int main(int argc,char*argv) int n; if (argc2) printf(Usage:%s nn,argv0); return-1; else n=atoi(argv1); printf(“Factorial of %d is %d.n”,n,factorial(n); return 0; 25/489.1 C語言編譯器語言編譯器GCC輸入下

12、面的命令:輸入下面的命令:lgcc o fac main.c factorial.c /編譯生成可執(zhí)編譯生成可執(zhí)行文件行文件facl./fac 6 /執(zhí)行程序執(zhí)行程序fac,實(shí)參數(shù)為,實(shí)參數(shù)為6lFactorial of 6 is 720 /輸出運(yùn)行結(jié)果輸出運(yùn)行結(jié)果26/489.1 C語言編譯器語言編譯器GCC 生成可執(zhí)行程序的最后一個(gè)步驟是鏈接,也就是將分生成可執(zhí)行程序的最后一個(gè)步驟是鏈接,也就是將分散的目標(biāo)文件和庫文件組合起來。通常在散的目標(biāo)文件和庫文件組合起來。通常在Linux系統(tǒng)系統(tǒng)上,這些庫文件可以在上,這些庫文件可以在/lib與與/usr/lib目錄中找到。目錄中找到。當(dāng)用戶使用的

13、是靜態(tài)的函數(shù)庫時(shí),鏈接器會找到程序當(dāng)用戶使用的是靜態(tài)的函數(shù)庫時(shí),鏈接器會找到程序需要的模組,將它們物理復(fù)制到課執(zhí)行文件中內(nèi)。共需要的模組,將它們物理復(fù)制到課執(zhí)行文件中內(nèi)。共享函數(shù)庫會在執(zhí)行文件時(shí)留下一個(gè)記號,指明程序執(zhí)享函數(shù)庫會在執(zhí)行文件時(shí)留下一個(gè)記號,指明程序執(zhí)行時(shí),首先必須加載這個(gè)函數(shù)庫。行時(shí),首先必須加載這個(gè)函數(shù)庫。共享函數(shù)庫使執(zhí)行文件更小,共享函數(shù)庫使執(zhí)行文件更小,Linux默認(rèn)的行為時(shí)鏈默認(rèn)的行為時(shí)鏈接共享函數(shù)庫。接共享函數(shù)庫。靜態(tài)函數(shù)庫(靜態(tài)函數(shù)庫(.a),共享函數(shù)庫(),共享函數(shù)庫(.so.x.x.x)27/489.1 C語言編譯器語言編譯器GCC 函數(shù)庫函數(shù)庫l用戶可用用戶可用

14、 “l(fā)dd” 命令來查程序需要的共享函數(shù)庫:命令來查程序需要的共享函數(shù)庫:上例說明上例說明 p3.1 依賴依賴libC.so.6與與linux-gate.so.l的存在的存在lLinux 缺省的行為是連接共享函數(shù)庫。缺省的行為是連接共享函數(shù)庫。28/489.1 C語言編譯器語言編譯器GCC調(diào)試程序調(diào)試程序lGCC包含完整的出錯(cuò)檢查和警告提示功能,可以包含完整的出錯(cuò)檢查和警告提示功能,可以幫助幫助Linux程序員寫出更加專業(yè)的代碼。程序員寫出更加專業(yè)的代碼。l代碼:代碼:illcode.c程序程序 #include void main(void) long long int var=1; pri

15、ntf(It is not standard C code!n); 29/489.1 C語言編譯器語言編譯器GCC調(diào)試程序調(diào)試程序l存在以下問題:存在以下問題:lMain函數(shù)的返回值被聲明為函數(shù)的返回值被聲明為void,但實(shí)際上應(yīng)該,但實(shí)際上應(yīng)該是是intl使用了使用了“l(fā)ong long”來聲明整數(shù),不符合來聲明整數(shù),不符合ANSI/ISO C語言規(guī)范語言規(guī)范lMain函數(shù)在終止前沒有調(diào)用函數(shù)在終止前沒有調(diào)用return語句語句30/489.1 C語言編譯器語言編譯器GCC調(diào)試程序調(diào)試程序l-pedantic參數(shù)檢查源代碼是否符合參數(shù)檢查源代碼是否符合ANSI/ISO C語語言規(guī)范言規(guī)范l-

16、Wall或或-W參數(shù)能夠使參數(shù)能夠使GCC產(chǎn)生盡可能多的警告產(chǎn)生盡可能多的警告信息。信息。31/489.1 C語言編譯器語言編譯器GCC調(diào)試器調(diào)試器l在在 Linux 環(huán)境下最普及的調(diào)試工具是環(huán)境下最普及的調(diào)試工具是 GDB 和和DDD,此處僅對,此處僅對 GDB 作簡單介紹。作簡單介紹。l調(diào)試器的功能就是能夠觀察一個(gè)程序在執(zhí)行時(shí)的調(diào)試器的功能就是能夠觀察一個(gè)程序在執(zhí)行時(shí)的內(nèi)部活動(dòng),或程序出錯(cuò)時(shí)發(fā)生了什么。內(nèi)部活動(dòng),或程序出錯(cuò)時(shí)發(fā)生了什么。GNU 的調(diào)的調(diào)試器稱為試器稱為 GDB( GNU debuger ),該程序是一個(gè),該程序是一個(gè)交互式工具,工作在字符模式,可用于源代碼級交互式工具,工作

17、在字符模式,可用于源代碼級調(diào)試,以及跟蹤沒有源代碼的程序或檢查某個(gè)終調(diào)試,以及跟蹤沒有源代碼的程序或檢查某個(gè)終止的程序留下的核心文件。止的程序留下的核心文件。32/489.1 C語言編譯器語言編譯器GCClGDB 主要有以下這些功能:主要有以下這些功能:(1)能跟蹤程序中變量的值。)能跟蹤程序中變量的值。(2)能夠設(shè)置斷點(diǎn)使程序在指定的代碼行上停)能夠設(shè)置斷點(diǎn)使程序在指定的代碼行上停下來。下來。(3)能夠一行行地執(zhí)行源代碼。)能夠一行行地執(zhí)行源代碼。(4)修正某個(gè))修正某個(gè) bug 引起的問題,然后繼續(xù)查找引起的問題,然后繼續(xù)查找另一個(gè)另一個(gè) bug。33/489.1 C語言編譯器語言編譯器G

18、CCl一般來說一般來說 GDB 主要調(diào)試的是主要調(diào)試的是 C/C+ 的程序。要的程序。要調(diào)試調(diào)試 C/C+ 的程序,首先在編譯時(shí),必須把調(diào)試的程序,首先在編譯時(shí),必須把調(diào)試信息加到可執(zhí)行文件中。使用編譯器信息加到可執(zhí)行文件中。使用編譯器(gcc/g+)的的 -g 參數(shù)參數(shù)可以做到這一點(diǎn)。如:可以做到這一點(diǎn)。如: gcc -g test.c -o test g+ -g test.cpp -o test 如果沒有如果沒有 -g,在調(diào)試時(shí)將見不到程序的函數(shù)名、,在調(diào)試時(shí)將見不到程序的函數(shù)名、變量名,所代替的全是運(yùn)行時(shí)的內(nèi)存地址。變量名,所代替的全是運(yùn)行時(shí)的內(nèi)存地址。l啟動(dòng)啟動(dòng) GDB 的方法是從命令

19、行鍵入的方法是從命令行鍵入 “gdb filename”,按回車鍵就可以運(yùn)行按回車鍵就可以運(yùn)行 GDB 來調(diào)試可執(zhí)行文件。來調(diào)試可執(zhí)行文件。34/489.1 C語言編譯器語言編譯器GCCl基本基本 GDB 命令命令 :file 裝入想要調(diào)試的可執(zhí)行文件裝入想要調(diào)試的可執(zhí)行文件kill 終止正在調(diào)試的程序終止正在調(diào)試的程序list 列出產(chǎn)生執(zhí)行文件的源代碼的一部分列出產(chǎn)生執(zhí)行文件的源代碼的一部分next 執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部step 執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部run 執(zhí)行當(dāng)前被調(diào)試的程序執(zhí)行當(dāng)前被調(diào)試的程序quit 終止終

20、止 gdbwatch 監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變break 在代碼里設(shè)置斷點(diǎn)在代碼里設(shè)置斷點(diǎn), 這將使程序執(zhí)行到這里時(shí)被這將使程序執(zhí)行到這里時(shí)被掛起掛起shell 不離開不離開 gdb 就執(zhí)行就執(zhí)行 UNIX shell 命令命令35/489.1 C語言編譯器語言編譯器GCCGDB使用舉例使用舉例l源代碼如下源代碼如下編譯:gcc o bug bug.c36/489.1 C語言編譯器語言編譯器GCCl編譯并運(yùn)行編譯并運(yùn)行編譯編譯?37/489.1 C語言編譯器語言編譯器GCCl使用使用gdb調(diào)試調(diào)試bug輸入字符串輸入字符串運(yùn)行運(yùn)行bug出錯(cuò)位置出錯(cuò)位

21、置能不能看到源代碼呢?能不能看到源代碼呢?38/489.1 C語言編譯器語言編譯器GCCl使用使用gcc的的-g參數(shù)參數(shù)gcc g o bug bug.c重新調(diào)試重新調(diào)試源代碼源代碼39/489.1 C語言編譯器語言編譯器GCC40/489.2 程序維護(hù)工具程序維護(hù)工具make引言引言l隨著軟件復(fù)雜度的提高,人們提出了模塊化的概隨著軟件復(fù)雜度的提高,人們提出了模塊化的概念,即將復(fù)雜的軟件分解為很多細(xì)小的功能模塊,念,即將復(fù)雜的軟件分解為很多細(xì)小的功能模塊,于是,軟件代碼按功能模塊分散到各個(gè)不同的文于是,軟件代碼按功能模塊分散到各個(gè)不同的文件。件。l這使得編譯這些文件成為問題,有時(shí)候只是改動(dòng)這使

22、得編譯這些文件成為問題,有時(shí)候只是改動(dòng)某個(gè)文件就不得不重新編譯整個(gè)工程。對于大型某個(gè)文件就不得不重新編譯整個(gè)工程。對于大型項(xiàng)目而言,重新編譯所有代碼往往需要很長時(shí)間。項(xiàng)目而言,重新編譯所有代碼往往需要很長時(shí)間。l使用使用make對源代碼進(jìn)行管理后,將只編譯改動(dòng)的對源代碼進(jìn)行管理后,將只編譯改動(dòng)的代碼文件,而不用完全編譯。代碼文件,而不用完全編譯。41/489.2 程序維護(hù)工具程序維護(hù)工具makemake工具工具lMake通過讀入配置好的文本文件,并根據(jù)通過讀入配置好的文本文件,并根據(jù)文本文件中預(yù)先定義的規(guī)則和步驟,完成文本文件中預(yù)先定義的規(guī)則和步驟,完成代碼的編譯和鏈接工作,最終生成所需要代碼

23、的編譯和鏈接工作,最終生成所需要的項(xiàng)目文件。這個(gè)文本文件在缺失情況下的項(xiàng)目文件。這個(gè)文本文件在缺失情況下為為makefile或或Makefile。lMake在對項(xiàng)目文件進(jìn)行編譯時(shí),在對項(xiàng)目文件進(jìn)行編譯時(shí), 會判斷會判斷文件的修改和生成時(shí)間。如果某源代碼文文件的修改和生成時(shí)間。如果某源代碼文件在上次編譯后再次被修改,則件在上次編譯后再次被修改,則make將只將只編譯該文件,而不會對整個(gè)重新編譯編譯該文件,而不會對整個(gè)重新編譯。42/489.2 程序維護(hù)工具程序維護(hù)工具makeMakefile示例示例 p3.1.c程序?yàn)槔?,使用程序?yàn)槔?,使用vi編寫編寫makefile文件,文件,內(nèi)容如下:內(nèi)容如

24、下: p3.1:p3.1.c tab鍵鍵gcc o p3.1 p3.1.c9.2 程序維護(hù)工具程序維護(hù)工具make43/4844/489.2 程序維護(hù)工具程序維護(hù)工具make基本原理和用法基本原理和用法l1. 依賴關(guān)系描述依賴關(guān)系描述一般的語法規(guī)則為:一般的語法規(guī)則為:target(目標(biāo)名):(目標(biāo)名):dependenCy(依賴模塊)(依賴模塊)command(命令行)(命令行)l2. make 語法規(guī)則語法規(guī)則make命令的一般語法規(guī)則是:命令的一般語法規(guī)則是:make-f make文件名文件名目標(biāo)名目標(biāo)名 45/489.2 程序維護(hù)工具程序維護(hù)工具make例子:p3.3.c中用到p3.3.part1.c和p3.3.part2.c中定義的函數(shù)。如果要編譯p3.3.c必須先對p3.3.part1.c和p3.3.part2.c進(jìn)行編譯。p3.3.part1.c #inc

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論