第九章-Linux下的C和C++編程_第1頁(yè)
第九章-Linux下的C和C++編程_第2頁(yè)
第九章-Linux下的C和C++編程_第3頁(yè)
第九章-Linux下的C和C++編程_第4頁(yè)
第九章-Linux下的C和C++編程_第5頁(yè)
已閱讀5頁(yè),還剩45頁(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下的C和C++編程2/48目錄引言C語(yǔ)言編譯器GCC程序維護(hù)工具make小結(jié)3/48引言Linux軟件開(kāi)發(fā)一直在Internet環(huán)境下進(jìn)行。這個(gè)環(huán)境是全球性的,編程人員來(lái)自世界各地。Linux開(kāi)發(fā)工作經(jīng)常是在Linux用戶決定共同完成一個(gè)項(xiàng)目時(shí)開(kāi)始的。當(dāng)開(kāi)發(fā)工作完成后,該軟件就被放到Internet站點(diǎn)上,任何用戶都可以訪問(wèn)和下載它。由于這個(gè)活躍的開(kāi)發(fā)環(huán)境,新的以Linux為基礎(chǔ)的軟件功能日益強(qiáng)大,且呈爆炸式的增長(zhǎng)態(tài)勢(shì)。大多數(shù)Linux軟件是經(jīng)過(guò)自由軟件基金會(huì)(FreeSoftwareFoundation)提供的GNU(GNU即GNU’snotUNIX)公開(kāi)認(rèn)證授權(quán)的,因而通常被稱作GNU軟件。GNU軟件免費(fèi)提供給用戶使用,并被證明是非??煽亢透咝У?。許多流行的Linux實(shí)用程序,如C編譯器、shell和編輯器都是GNU軟件應(yīng)用程序。4/48引言需要C語(yǔ)言嗎?Shell夠用嗎?腳本語(yǔ)言是一種解釋性語(yǔ)言,用戶輸入只有當(dāng)執(zhí)行腳本后才被識(shí)別和執(zhí)行。解釋性語(yǔ)言在每次執(zhí)行腳本時(shí)必須重新解釋,效率低下,也不適合于直接操作計(jì)算機(jī)的RAM和I/O設(shè)備。Linux和C語(yǔ)言關(guān)聯(lián)?Shell命令和Linux內(nèi)核都是用C和C++編寫而成的。5/48引言本節(jié)學(xué)習(xí)主要內(nèi)容:如何在Linux下安裝和使用GUNC的編譯器GCCMake程序維護(hù)工具6/489.1C語(yǔ)言編譯器GCCGCC的安裝使用GCC

編譯器編譯程序函數(shù)庫(kù)調(diào)試器7/489.1C語(yǔ)言編譯器GCC在Linux開(kāi)發(fā)環(huán)境下,最常用的C/C++語(yǔ)言編譯器GCC(GNUCCompile)的縮寫,它是GNU/Linux系統(tǒng)下的標(biāo)準(zhǔn)C編譯器。目前,GCC可以支持多種高級(jí)語(yǔ)言,如C/C++ObjectCJAVAFortranPASCALADA等還可根據(jù)需要選擇安裝支持的語(yǔ)言。8/489.1C語(yǔ)言編譯器GCCgcc可以使程序員靈活地控制編譯過(guò)程。編譯過(guò)程一般可以分為下面四個(gè)階段,每個(gè)階段分別調(diào)用不同的工具進(jìn)行處理,如下圖所示。預(yù)處理鏈接編譯組譯源程序(*.c)可執(zhí)行文件預(yù)處理器編譯器組譯器連接器9.1C語(yǔ)言編譯器GCCGCC編譯分為四個(gè)步驟:預(yù)處理

GCC調(diào)用cpp程序進(jìn)行預(yù)處理,即分析像#include、#define之類的命令。編譯GCC是調(diào)用ccl程序進(jìn)行編譯的,它根據(jù)源代碼生成匯編語(yǔ)言。匯編GCC調(diào)用as程序?qū)⑸弦徊降慕Y(jié)果生成擴(kuò)展名為o的目標(biāo)文件連接

GCC調(diào)用ld程序?qū)⒛繕?biāo)文件進(jìn)行連接,最后生成可執(zhí)行文件。9/4810/489.1C語(yǔ)言編譯器GCCgcc的版本信息一般來(lái)說(shuō),系統(tǒng)安裝后就已經(jīng)安裝和設(shè)定好了gcc。在shell的提示符下鍵入gcc-v,屏幕上就會(huì)顯示出目前正在使用的gcc的版本。11/489.1C語(yǔ)言編譯器GCCGCC的安裝sudoapt-getinstallbuild-essential12/489.1C語(yǔ)言編譯器GCC9.1.2使用GCC

編譯器通常后跟一些選項(xiàng)和文件名來(lái)使用GCC

編譯器,gcc命令的基本用法如下:gcc[option|filename]g++[option|filename]其中option為gcc使用時(shí)的選項(xiàng),而filename為gcc要處理的文件(課本page.215)C程序:p3.1.c#include<stdio.h>#defineMIN(A,B)((A)>(B)?(B):(A))intmain(void){inta;a=MIN(1,2);printf("Theresultis:%d\n",a);return0;}13/4814/4815/4816/48C++程序:p3.2.cxx#include<iostream>#defineMIN(A,B)((A)>(B)?(B):(A))intmain(void){inta;a=MIN(1,2);std::<<"Theresultis:"<<a<<std::end;return0;}17/4818/48使用GCC控制編譯過(guò)程預(yù)處理:該步驟完成宏和include的處理。打開(kāi)p3.1.pre.c文件,可以發(fā)現(xiàn)處理在開(kāi)頭加入了許多函數(shù)聲明外,MIN(A,B)宏在代碼中也被展開(kāi)。19/48使用GCC控制編譯過(guò)程生成匯編代碼:該步驟將預(yù)處理生成的代碼進(jìn)行處理,并根據(jù)編程參數(shù)進(jìn)行優(yōu)化,最后生成匯編語(yǔ)言。20/48使用GCC控制編譯過(guò)程生成目標(biāo)代碼:該步驟把中間代碼變成特定機(jī)器上的指令代碼。21/48使用GCC控制編譯過(guò)程鏈接生成可執(zhí)行代碼。22/4823/489.1C語(yǔ)言編譯器GCC編譯main.c

和factorial.c

這兩個(gè)源文件。//factorial.c#include<stdio.h>intfactorial(intn){if(n<=1)return1;elsereturnfactorial(n-1)*n;}24/489.1C語(yǔ)言編譯器GCC//main.c#include<stdio.h>intfactorial(intn);intmain(intargc,char*argv[]){intn;if(argc<2){printf("Usage:%sn\n",argv[0]);return-1;}else{n=atoi(argv[1]);printf(“Factorialof%dis%d.\n”,n,factorial(n));}return0;}25/489.1C語(yǔ)言編譯器GCC輸入下面的命令:gcc–ofacmain.cfactorial.c//編譯生成可執(zhí)行文件fac./fac6//執(zhí)行程序fac,實(shí)參數(shù)為6Factorialof6is720//輸出運(yùn)行結(jié)果26/489.1C語(yǔ)言編譯器GCC

生成可執(zhí)行程序的最后一個(gè)步驟是鏈接,也就是將分散的目標(biāo)文件和庫(kù)文件組合起來(lái)。通常在Linux系統(tǒng)上,這些庫(kù)文件可以在/lib與/usr/lib目錄中找到。當(dāng)用戶使用的是靜態(tài)的函數(shù)庫(kù)時(shí),鏈接器會(huì)找到程序需要的模組,將它們物理復(fù)制到課執(zhí)行文件中內(nèi)。共享函數(shù)庫(kù)會(huì)在執(zhí)行文件時(shí)留下一個(gè)記號(hào),指明程序執(zhí)行時(shí),首先必須加載這個(gè)函數(shù)庫(kù)。共享函數(shù)庫(kù)使執(zhí)行文件更小,Linux默認(rèn)的行為時(shí)鏈接共享函數(shù)庫(kù)。靜態(tài)函數(shù)庫(kù)(.a),共享函數(shù)庫(kù)(.so.x.x.x)27/489.1C語(yǔ)言編譯器GCC

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

#include<stdio.h>voidmain(void){longlongintvar=1;printf("ItisnotstandardCcode!\n");}29/489.1C語(yǔ)言編譯器GCC調(diào)試程序存在以下問(wèn)題:Main函數(shù)的返回值被聲明為void,但實(shí)際上應(yīng)該是int使用了“l(fā)onglong”來(lái)聲明整數(shù),不符合ANSI/ISOC語(yǔ)言規(guī)范Main函數(shù)在終止前沒(méi)有調(diào)用return語(yǔ)句30/489.1C語(yǔ)言編譯器GCC調(diào)試程序-pedantic參數(shù)檢查源代碼是否符合ANSI/ISOC語(yǔ)言規(guī)范-Wall或-W參數(shù)能夠使GCC產(chǎn)生盡可能多的警告信息。31/489.1C語(yǔ)言編譯器GCC調(diào)試器在Linux環(huán)境下最普及的調(diào)試工具是GDB和DDD,此處僅對(duì)GDB作簡(jiǎn)單介紹。調(diào)試器的功能就是能夠觀察一個(gè)程序在執(zhí)行時(shí)的內(nèi)部活動(dòng),或程序出錯(cuò)時(shí)發(fā)生了什么。GNU的調(diào)試器稱為GDB(GNUdebuger),該程序是一個(gè)交互式工具,工作在字符模式,可用于源代碼級(jí)調(diào)試,以及跟蹤沒(méi)有源代碼的程序或檢查某個(gè)終止的程序留下的核心文件。32/489.1C語(yǔ)言編譯器GCCGDB

主要有以下這些功能:(1)能跟蹤程序中變量的值。(2)能夠設(shè)置斷點(diǎn)使程序在指定的代碼行上停下來(lái)。(3)能夠一行行地執(zhí)行源代碼。(4)修正某個(gè)bug引起的問(wèn)題,然后繼續(xù)查找另一個(gè)bug。33/489.1C語(yǔ)言編譯器GCC一般來(lái)說(shuō)GDB主要調(diào)試的是C/C++的程序。要調(diào)試C/C++的程序,首先在編譯時(shí),必須把調(diào)試信息加到可執(zhí)行文件中。使用編譯器(gcc/g++)的-g參數(shù)可以做到這一點(diǎn)。如:gcc-gtest.c-otestg++-gtest.cpp-otest如果沒(méi)有-g,在調(diào)試時(shí)將見(jiàn)不到程序的函數(shù)名、變量名,所代替的全是運(yùn)行時(shí)的內(nèi)存地址。啟動(dòng)GDB的方法是從命令行鍵入“gdbfilename”,按回車鍵就可以運(yùn)行GDB來(lái)調(diào)試可執(zhí)行文件。34/489.1C語(yǔ)言編譯器GCC基本GDB

命令:file

裝入想要調(diào)試的可執(zhí)行文件kill終止正在調(diào)試的程序list列出產(chǎn)生執(zhí)行文件的源代碼的一部分next執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部step執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部run執(zhí)行當(dāng)前被調(diào)試的程序quit終止gdbwatch監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變break在代碼里設(shè)置斷點(diǎn),這將使程序執(zhí)行到這里時(shí)被掛起shell不離開(kāi)gdb

就執(zhí)行UNIX

shell

命令35/489.1C語(yǔ)言編譯器GCCGDB使用舉例源代碼如下編譯:gcc–obugbug.c36/489.1C語(yǔ)言編譯器GCC編譯并運(yùn)行編譯????37/489.1C語(yǔ)言編譯器GCC使用gdb調(diào)試bug輸入字符串運(yùn)行bug出錯(cuò)位置能不能看到源代碼呢?38/489.1C語(yǔ)言編譯器GCC使用gcc的-g參數(shù)gcc–g–obugbug.c重新調(diào)試源代碼39/489.1C語(yǔ)言編譯器GCC40/489.2程序維護(hù)工具make引言隨著軟件復(fù)雜度的提高,人們提出了模塊化的概念,即將復(fù)雜的軟件分解為很多細(xì)小的功能模塊,于是,軟件代碼按功能模塊分散到各個(gè)不同的文件。這使得編譯這些文件成為問(wèn)題,有時(shí)候只是改動(dòng)某個(gè)文件就不得不重新編譯整個(gè)工程。對(duì)于大型項(xiàng)目而言,重新編譯所有代碼往往需要很長(zhǎng)時(shí)間。使用make對(duì)源代碼進(jìn)行管理后,將只編譯改動(dòng)的代碼文件,而不用完全編譯。41/489.2程序維護(hù)工具makemake工具M(jìn)ake通過(guò)讀入配置好的文本文件,并根據(jù)文本文件中預(yù)先定義的規(guī)則和步驟,完成代碼的編譯和鏈接工作,最終生成所需要的項(xiàng)目文件。這個(gè)文本文件在缺失情況下為makefile或Makefile。Make在對(duì)項(xiàng)目文件進(jìn)行編譯時(shí),會(huì)判斷文件的修改和生成時(shí)間。如果某源代碼文件在上次編譯后再次被修改,則make將只編譯該文件,而不會(huì)對(duì)整個(gè)重新編譯。42/489.2程序維護(hù)工具makeMakefile示例p3.1.c程序?yàn)槔?,使用vi編寫makefile文件,內(nèi)容如下:p3.1:p3.1.c

[tab鍵]gcc–op3.1p3.1.c9.2程序維護(hù)工具make43/4844/489.2程序維護(hù)工具make基本原理和用法1.依賴關(guān)系描述一般的語(yǔ)法規(guī)則為:target(目標(biāo)名):dependenCy(依賴模塊)command(命令行)2.make語(yǔ)法規(guī)則make命令的一般語(yǔ)法規(guī)則是:make[-fmake文件名][目標(biāo)名]

45/489.2程序維護(hù)工具make例子:p3.3.c中用到p3.3.part1.c和p3.3.part2.c中定義的函數(shù)。如果要編譯p3.3.c必須先對(duì)p3.3.part1.c和p3.3.part2.c進(jìn)行編譯。p3.3.part1.c#include<stdio.h>voidpart_one(){printf(“inthepartonefunction!\n”);}46/489.2程序維護(hù)工具makep3.3.part2.c#include<stdio.h>voidpart_two(){printf(“intheparttwofunction!\n”);}p3.3.c#incl

溫馨提示

  • 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)論