Linux培訓C編程_第1頁
Linux培訓C編程_第2頁
Linux培訓C編程_第3頁
Linux培訓C編程_第4頁
Linux培訓C編程_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、內(nèi)容提綱內(nèi)容提綱lgcclgdblMakelWindows到Linux程序移植C C語言簡介語言簡介l在80年代末期美國國家標準協(xié)會(American National Standards Institute)發(fā)布了一個被稱為ANSI C的C語言標準。這更加保證了將來在不同平臺上的C的一致性。lLinux上可用的C編譯器是GNU C編譯器, 它建立在自由軟件基金會的編程許可證的基礎上,因此可以自由發(fā)布。你能在Linux的發(fā)行光盤上找到它 GNU C GNU C 編譯器編譯器 一、基本用法 gcc options filenames說明:l在gcc后面可以有多個編譯選項,同時進行多個編譯操作。很

2、多的gcc選項包括一個以上的字符。因此你必須為每個選項指定各自的連字符。例如,下面的兩個命令是不同的:l當不用任何選項編譯一個程序時,GCC將會建立(假定編譯成功)一個名為a.out的可執(zhí)行文件。 基本編譯選項基本編譯選項l-o選項 你能用 -o 編譯選項來為將產(chǎn)生的可執(zhí)行文件指定一個文件名來代替 a.out。l -c選項:告訴GCC僅把源代碼編譯為目標代碼而跳過匯編和連接的步驟。這個選項使用的非常頻繁,因為它使得編譯多個C程序時速度更快并且更易于管理。缺省時GCC建立的目標代碼文件有一個.o的擴展名。 警告選項警告選項 在gcc中用開關-Wall控制警告信息,使用示例命令如下:查找選項查找選

3、項 gcc一般使用默認路徑查找頭文件和庫文件。如果文件所用的頭文件或庫文件不在缺省目錄下,則編譯時要指定它們的查找路徑。l-I選項:指定頭文件的搜索目錄例:l-L選項:指定庫文件的搜索目錄例:多個源文件生成一個可執(zhí)行文件多個源文件生成一個可執(zhí)行文件 問題:有多個源文件時,如何生成一個可執(zhí)行文件?l方法2:gcc-Wall c test3.c 優(yōu)化選項優(yōu)化選項 優(yōu)化選項可以使GCC在耗費更多編譯時間和犧牲易調(diào)試性的基礎上產(chǎn)生更小更快的可執(zhí)行文件。這些選項中最典型的是-O和-O2選項。l-O選項:告訴GCC對源代碼進行基本優(yōu)化。這些優(yōu)化在大多數(shù)情況下都會使程序執(zhí)行的更快。l-O2選項:告訴GCC

4、產(chǎn)生盡可能小和盡可能快的代碼。-O2選項將使編譯的速度比使用-O時慢。但通常產(chǎn)生的代碼執(zhí)行速度會更快。 版本選項版本選項l-v選項 用戶將會得到自己目前正在使用的gcc的版本及與版本相關的一些信息。 gcc -v 將得到如下結果:l-V 選項 如果安裝了多個版本的gcc,并且想強制執(zhí)行其中的某個版本,可以用命令通知系統(tǒng)用戶要使用的版本。 gcc -V2.6.3 -v調(diào)試和剖析選項調(diào)試和剖析選項 使用調(diào)試選項后,gcc在進行編譯的時候,在目標文件(.o)和創(chuàng)建的可執(zhí)行文件中插入額外信息,這些額外信息使gdb能夠判斷編譯過的代碼和源代碼之間的關系。l-g選項:告訴GCC產(chǎn)生能被 GNU 調(diào)試器使用

5、的調(diào)試信息以便調(diào)試你的程序。l-pg選項:告訴GCC在你的程序里加入額外的代碼,執(zhí)行時,產(chǎn)生gprof用的剖析信息以顯示你的程序的耗時情況。l使用gdb調(diào)試工具,命令行如下: 用用gdbgdb調(diào)試調(diào)試GCCGCC程序程序 gdb是一個用來調(diào)試C和C+程序的常用調(diào)試工具之一。 gdb所提供的一些功能:l監(jiān)視程序中變量的值。l設置斷點以使程序在指定的代碼行上停止執(zhí)行。 l逐行執(zhí)行代碼。l分析崩潰程序的產(chǎn)生的core文件gdbgdb基本用法基本用法 需要調(diào)試的程序,在編譯時要使用調(diào)試選項。在默認的情況下,調(diào)試符號不會編譯到程序中。調(diào)試之后,不需要重新編譯程序。gdb filename出現(xiàn)(gdb)在

6、這里,可以輸入調(diào)試命令基本基本gdbgdb命令命令lfile 裝入想要調(diào)試的可執(zhí)行文件。lkill 終止正在調(diào)試的程序。llist 執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部。lnext 執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部。lstep 執(zhí)行一行源代碼而且進入函數(shù)內(nèi)部。lrun 執(zhí)行當前被調(diào)試的程序lquit 終止 gdblwatch 能監(jiān)視一個變量的值而不管它何時被改變。lbreak 在代碼里設置斷點, 這將使程序執(zhí)行到這里時被掛起。lmake 能不退出 gdb 就可以重新產(chǎn)生可執(zhí)行文件。lshell 能不離開 gdb 就執(zhí)行 UNIX shell 命令。GDBGDB的靜態(tài)調(diào)試啟動方法的靜態(tài)調(diào)試啟動方法l當需

7、要在命令行通過gdb來啟動可執(zhí)行程序的時候:gdb l此時gdb會加載可執(zhí)行程序的符號表和堆棧,并為啟動程序作好準備;l設置可執(zhí)行程序的命令行參數(shù): set args l設置斷點: b或breakl通過命令r或run來啟動程序,或者通過c或continue命令來繼續(xù)已經(jīng)被暫停的程序;l當程序core的時候,需要查看core文件的內(nèi)容,使用以下方式: gdb l此時候,gdb會結合可執(zhí)行程序的符號和堆棧來查看core文件內(nèi)容,以分析程序在core掉時的內(nèi)存影象;GDBGDB的動態(tài)調(diào)試啟動方法的動態(tài)調(diào)試啟動方法l動態(tài)調(diào)試就是在不終止正在運行的進程的情況下來對這個正在運行的進程進行調(diào)試lgdb l直

8、接在gdb中把一個正在運行的進程連接到gdb中,以便于進行動態(tài)調(diào)試使用attach命令: attach detach: 調(diào)試結束之后,可以使用該命令斷開進程與gdb的連接l使用attach命令的例子:gdbfile #指定進程所關聯(lián)的程序源代碼和符號表 attach . 使用gdb的命令進行調(diào)試; . detach #調(diào)試結束,解除進程與gdb的連接,使進程繼續(xù)運行GDBGDB調(diào)試過程中使用到的概念和命令調(diào)試過程中使用到的概念和命令lgdb的工作路徑:pwd: 查看gdb當前的工作路徑; cd : 改變gdb當前的工作路徑; info terminal:顯示gdb當前所使用的終端的類型信息gd

9、bgdb的環(huán)境的環(huán)境lshow paths: 顯示當前路徑變量的設置情況;lshow environment/env VARNAME:顯示程序的環(huán)境變量VARNAME的值;lset environment/env VARNAME = VALUE:設置程序的某個環(huán)境變量VARNAME的值;只對所調(diào)試的程序有效,對gdb本身不起作用lunset environment/env VARNAME:刪除程序的某個環(huán)境變量VARNAME;斷點斷點l斷點的作用是當程序運行到斷點時,無論它在做什么,都會被停止下來.對于每個斷點,你還可以設置一些更高級的信息以決定斷點在什么時候起作用.l設置斷點的位置:代碼行、

10、函數(shù)上、地址上.在那些含有異常處理的語言(如C+)中,還可以在異常發(fā)生的地方設置斷點l斷點分為普通斷點和條件斷點設置普通的斷點設置普通的斷點l使用break/b命令來設置普通斷點;有很多種方法可以設置斷點:A、break FUNCTION 在某個函數(shù)上設置斷點B、break +OFFSET 或 break OFFSET 程序運行到當前行時的前幾行或后幾行; OFFSET表示行號; C、break LINENUM 在行號為LINENUM的行上設置斷點. D、break FILENAME:LINENUM 在FILENAME文件中的第LINENUM行上設置斷點; E、break FILENAME:F

11、UNCTION 在FILENAME文件中的名為FUNCTION的函數(shù)上設置斷點 F、break *ADDRESS 在地址ADDRESS上設置斷點.這個命令允許你在沒有調(diào)試信息的程序中設置斷點;G、break 不含任何參數(shù)的break命令,會在當前執(zhí)行到的程序運行棧中的下一條指令上設置一個斷點.條件斷點條件斷點l條件斷點就是設置的斷點只在某個條件成立的時候才有效,才會使程序在運行到斷點之前停止; break . if CONDITIONl這個命令設置一個條件斷點,條件由CONDITION來決定.在gdb每次執(zhí)行到此時,如果CONDITION條件的值被計算為非0,那么程序就在該斷點處停止;ltbr

12、eak ARGS:l該命令設置斷點為只有效一次.ARGS的使用同break中的參數(shù)的使用刪除斷點刪除斷點l當一個斷點使用完之后,需要刪除這些斷點;clear命令和delete命令可以完成這項任務; A、clear: 不帶任何參數(shù)的clear命令會在當前所選擇的棧上清除下一個所要執(zhí)行到的斷點(指令級).當你當前的棧幀是棧中最內(nèi)層的時候,使用這個命令可以很方便地刪除剛才程序停止處的斷點; B、clear FUNCTION 和 clear FILENAME:FUNCTION 刪除名為FUNCTION的函數(shù)上的斷點; C、clear LINENUM 和 clear FILENAME:LINENUM 刪

13、除第LINENUM行上的斷點; D、delete breakpoints BNUMS.使斷點暫時不起作用使斷點暫時不起作用l使用enable命令來激活斷點或觀察點l使用disable命令來使斷點或觀察點暫時不起作用l使用info break或info watch命令來觀察哪些斷點是活躍的;設置觀察點設置觀察點l可以使用一個觀察點來停止一個程序的執(zhí)行,當某個表達式的值改變時,觀察點將會停止程序,而不需要事先在某個地方設置一個斷點 A、watch EXPR watch命令使用EXPR作為表達式設置一個觀察點.gdb將把表達式加入到程序中,并監(jiān)視程序的運行,當表達式的值被改變的時候,gdb將會停止程

14、序 B、rwatch EXPR: 使用EXPR作為表達式設置一個斷點,當EXPR被程序讀取時,程序被gdb暫停 C、awatch EXPR: 使用EXPR作為表達式設置一個觀察點,當EXPR被讀出然后被寫入時,gdb會暫停程序;這個命令常和rwatch合用 D、info watchpoints: 顯示所有設置的觀察點的列表;它與info breakpoints命令類似其它其它gdbgdb調(diào)試命令調(diào)試命令lcontinue/c: 繼續(xù)運行被中斷的程序;lbacktrace/bt: 顯示當前堆棧的內(nèi)容;lprint/p : 打印表達式或變量的值;lframe/f : 選擇一個棧幀,并進入這個棧幀,

15、同時打印被選擇的棧幀的內(nèi)容摘要信息;該命令的參數(shù)是一個棧幀的號碼或者是一個棧幀地址;linfo stack/frame: 顯示棧/幀的摘要信息;lrun/r: 在gdb中啟動并運行程序;lhelp info: 顯示命令info的用法;lhelp : 顯示命令Command的詳細用法對多線程程序的調(diào)試對多線程程序的調(diào)試lthread THREAD_NO: 該命令用于在線程之間進行切換,把線程號為THREAD_NO(gdb設置的線程號)的線程設置為當前線程linfo threads: 查詢當前進程所擁有的所有線程的狀態(tài)摘要信息;gdb按照順序顯示:a、線程號: gdb為被調(diào)試進程中的線程設置的順序

16、號;b、目標系統(tǒng)的線程標識;c、此線程的當前棧信息;l一些前面帶*號的線程,表示該線程是當前線程;lthread apply THREAD_NO ALL ARGS: 該命令用于向線程提供命令 實例實例l程序test3_1a.c(簡單程序樣例)(程序優(yōu)化樣例 ,用命令time ./test3_2查看效果)l程序test3_3.c(錯誤程序的例子,用gdb查錯)程序自動維護工具程序自動維護工具makemake問題:當開發(fā)的程序非常龐大,且關系復雜,手工編譯鏈接非常困難解決: 利用一個自動系統(tǒng)控制和協(xié)調(diào)整個程序的創(chuàng)建過程。在這個自動系統(tǒng)中,程序員可以定義創(chuàng)建規(guī)則并通過這個規(guī)則進行項目的開發(fā)。 mak

17、efile就是定義這種規(guī)則的文件。GNU make 解釋執(zhí)行Makefile/makefile。make是一種自動生成和維護目標程序的工具。l可以調(diào)用編譯器、連接器等l根據(jù)程序各部分的修改情況,重新編譯鏈接目標代碼l輸入make命令后,系統(tǒng)自動檢測系統(tǒng)文件和以定義的規(guī)則,完成整個創(chuàng)建過程 程序自動維護工具程序自動維護工具makemake簡單makefile文件的寫法由若干規(guī)則組成,每個規(guī)則說明一個目標規(guī)則的格式:目標目標 屬性屬性分隔符分隔符 依賴文件依賴文件;命令菜單命令菜單 命令菜單命令菜單 說明:表示可選,表示可以多次出現(xiàn) 涉及的文件名允許用通配符 程序自動維護工具程序自動維護工具mak

18、emakemakemake命令的使用命令的使用 make option macrodef targetlmake命令默認的文件是makefile(Makefile),也可以用“-f 文件名”指定要解釋執(zhí)行的文件。lmake默認從文件指定的第一條規(guī)則開始執(zhí)行,并根據(jù)第一條中的依賴文件順次執(zhí)行。也可以通過target直接指定執(zhí)行的目標。LinuxLinux到到WindowsWindows之間程序代碼移植之間程序代碼移植l移植的一些考慮原則:l引入新的代碼,而不修改原有的代碼。在沒有辦法進行調(diào)試前修改源代碼是不允許的,修改的不好就會引起最后代碼運行邏輯的混亂,而且在代碼能夠運行之前是很難發(fā)現(xiàn)問題的。所以除非非常有把握,否則不要修改被移植工程的源代碼。l引入新的代碼之后,不能因為

溫馨提示

  • 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

提交評論