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

下載本文檔

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

文檔簡介

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

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

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

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

編譯器通常后跟一些選項和文件名來使用GCC

編譯器,gcc命令的基本用法如下:gcc[option|filename]g++[option|filename]其中option為gcc使用時的選項,而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控制編譯過程預處理:該步驟完成宏和include的處理。打開p3.1.pre.c文件,可以發(fā)現(xiàn)處理在開頭加入了許多函數(shù)聲明外,MIN(A,B)宏在代碼中也被展開。19/48使用GCC控制編譯過程生成匯編代碼:該步驟將預處理生成的代碼進行處理,并根據(jù)編程參數(shù)進行優(yōu)化,最后生成匯編語言。20/48使用GCC控制編譯過程生成目標代碼:該步驟把中間代碼變成特定機器上的指令代碼。21/48使用GCC控制編譯過程鏈接生成可執(zhí)行代碼。22/4823/489.1C語言編譯器GCC編譯main.c

和factorial.c

這兩個源文件。//factorial.c#include<stdio.h>intfactorial(intn){if(n<=1)return1;elsereturnfactorial(n-1)*n;}24/489.1C語言編譯器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語言編譯器GCC輸入下面的命令:gcc–ofacmain.cfactorial.c//編譯生成可執(zhí)行文件fac./fac6//執(zhí)行程序fac,實參數(shù)為6Factorialof6is720//輸出運行結果26/489.1C語言編譯器GCC

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

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

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

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

命令:file

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

就執(zhí)行UNIX

shell

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

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

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

溫馨提示

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

評論

0/150

提交評論