第3章嵌入式linux程序開發(fā)基礎_第1頁
第3章嵌入式linux程序開發(fā)基礎_第2頁
第3章嵌入式linux程序開發(fā)基礎_第3頁
第3章嵌入式linux程序開發(fā)基礎_第4頁
第3章嵌入式linux程序開發(fā)基礎_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

第3章嵌入式Linux程序開發(fā)基礎熟練掌握vi編輯器的使用掌握gcc編譯器的使用掌握gdb調試器掌握make命令和makefile工程管理學習目標vi編輯器gcc編譯器gdb調試器make命令和makefile工程管理學習內容Linux下C語言編程過程1.預處理對頭文件進行處理2.編譯

檢查語法,生成匯編語言3.匯編處理

將編譯階段的文件轉成目標文件4.鏈接

鏈接目標文件生成可執(zhí)行文件Vi是一個全屏幕交互式編輯程序,有三種使用模式:Vi編輯器Vi的啟動命令作用vifilefile存在打開,不存在則創(chuàng)建,光標定位在第1行1列vi+filefile存在打開,不存在則創(chuàng)建,光標定位在最后1行1列vi+nfilefile存在打開,不存在則創(chuàng)建,光標定位在第n行1列vi+/stringfilefile存在打開,不存在則創(chuàng)建,光標定位在第1次出現(xiàn)字符串string的行首位置Vi命令行模式常用功能鍵功能鍵功能i切換到插入模式ctrl+b|f屏幕往后(前)翻一頁0|G光標移動到本行的開頭(文件的最后)$|end移動光標到所在行的“行尾”(?)/name在光標(前)后查找一個名為name的字符串x(X)刪除光標所在位置的(前)一個字符(n)dd刪除光標所在行(光標所在行向下n行)(n)yy復制光標所在行(光標所在行向下n行)p粘貼(與yy搭配)u恢復前一個動作Vi末行模式常用功能鍵功能鍵功能:w將編輯的文件保存到磁盤中:q退出vi(對修改過的文件給出提示):q!強制退出vi(不保存修改過的文件):wq存盤后退出:w[filename]另存為一個名為filename的文件:setnu顯示行號:setnonu取消行號顯示是一款文本編輯器,類似于windows系統(tǒng)中的記事本,有菜單欄、工具欄、編輯欄、狀態(tài)欄啟動:$gedit打開(多個)文件:$geditfile1|(file2)將命令的輸出輸送到文件中:如$cat/etc/passwd|gedit其他工具:如統(tǒng)計文檔、文本顯示樣式、插入時間、查找等功能gedit編輯器Linux下C語言編程過程1.預處理對頭文件進行處理2.編譯

檢查語法,生成匯編語言3.匯編處理

將編譯階段的文件轉成目標文件4.鏈接

鏈接目標文件生成可執(zhí)行文件編譯器:把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序gcc編譯器能夠編譯用C、C++和ObjectC等語言編寫的程序。gcc支持編譯源文件的后綴名解釋如下:gcc編譯器后綴名對應的語言后綴名對應的語言.cC程序.h預處理頭文件.i經過預處理的C程序.o編譯后的目標文件.s匯編語言程序.a編譯后的庫文件gcc編譯常用選項選項含義-c只編譯不鏈接,生成目標文件“.o”-S只編譯不匯編,生成匯編代碼-E只編譯,不做其他處理-g在可執(zhí)行程序中包含調試信息-ofile將file指定為輸出文件一般格式為:gcc[選項]待編譯文件[選項][目標文件]1.預處理:把對頭文件或宏定義(#define、#ifdef等)進行處理,將包含的頭文件編譯進來,且可以使用“-E”選項進行查看。gcc編譯過程root@ubuntu:/home/jiang#gcc-Eaaa.c-oaaa.iroot@ubuntu:/home/jiang#ls-ltotal104-rw-rw-r--1rpdzkjrpdzkj1395月511:45aaa.c-rw-r--r--1rootroot176005月516:26aaa.iroot@ubuntu:/home/jiang#viaaa.i2.編譯處理:檢查代碼的規(guī)范性、是否有語法錯誤,檢查無誤后,將代碼翻譯成匯編語言,可采用“-S”查看root@ubuntu:/home/jiang#gcc-Saaa.i-oaaa.sroot@ubuntu:/home/jiang#ls-ltotal108-rw-rw-r--1rpdzkjrpdzkj1395月511:45aaa.c-rw-r--r--1rootroot176005月516:26aaa.i-rw-r--r--1rootroot7685月516:30aaa.sroot@ubuntu:/home/jiang#viaaa.s3.匯編處理:將編譯處理生成的“.s”文件轉化成目標文件,采用選項“-c”可查看。root@ubuntu:/home/jiang#gcc-caaa.s-oaaa.oroot@ubuntu:/home/jiang#ls-ltotal112-rw-rw-r--1rpdzkjrpdzkj1395月511:45aaa.c-rw-r--r--1rootroot176005月516:26aaa.i-rw-r--r--1rootroot15525月516:35aaa.o-rw-r--r--1rootroot7685月516:30aaa.sroot@ubuntu:/home/jiang#viaaa.o4.鏈接:將所有目標文件安排在可執(zhí)行程序中的恰當位置,所調用的庫函數(shù)也將連接到適當?shù)奈恢胷oot@ubuntu:/home/jiang#gccaaa.o-oaaaroot@ubuntu:/home/jiang#ls-ltotal124-rwxr-xr-x1rootroot83775月516:39aaa-rw-rw-r--1rpdzkjrpdzkj1395月511:45aaa.c-rw-r--r--1rootroot176005月516:26aaa.i-rw-r--r--1rootroot15525月516:35aaa.o-rw-r--r--1rootroot7685月516:30aaa.sroot@ubuntu:/home/jiang#./aaaInclude語句中“<>”表示在標準路徑中搜索頭文件,“”表示在本目錄中搜索Linux中的頭文件默認放在/usr/include目錄下“-Idir”選項可以在頭文件的搜索路徑列表中添加dir目錄gcc的–Idir選項root@ubuntu:/home#ls-l-rw-r--r--1rootroot19May620:36my.hroot@ubuntu:/home#vimy.h/*my.h*/#include<stdio.h>root@ubuntu:/home#cdjiangroot@ubuntu:/home/jiang#ls-ltotal84-rw-rw-r--1rpdzkjrpdzkj136May620:37aaa.croot@ubuntu:/home/jiang#viaaa.c/*aaa.c*/#include<my.h>voidmain(){………}root@ubuntu:/home/jiang#gccaaa.c-oaaaaaa.c:1:16:fatalerror:my.h:Nosuchfileordirectorycompilationterminated.root@ubuntu:/home/jiang#gccaaa.c-I/home/-oaaaroot@ubuntu:/home/jiang#ls-ltotal96-rwxr-xr-x1rootroot8377May620:49aaaroot@ubuntu:/home/jiang#./aaa#include命令實現(xiàn)“文件包含”操作,將其他源文件的內容包含的程序中,減少編寫程序的重復勞動。模塊化編程時,通過將程序的各個功能分割到多個程序文件中,將重復使用的代碼編寫到頭文件中,然后采用#include命令將他們嵌入到一個總的程序文件中。實例:P68文件包含處理gdb調試的功能:啟動被調試程序讓被調試的程序在指定的位置停住當程序被停住時,可以檢查程序狀態(tài)(如變量值)使用gdb調試器時:對.c文件進行編譯時要加上選項“-g”gdb是對可執(zhí)行文件進行調試,而不是.c文件gdb調試器gdb調試常用命令命令格式含義break行號或函數(shù)名設置斷點infob查看所涉斷點delete[斷點號]刪除斷點(斷點號是“inforb”中的第1欄)step單步恢復程序運行,且進入函數(shù)調用next單步恢復程序運行,但不進入函數(shù)調用finish運行程序,直到當前函數(shù)完成返回C繼續(xù)執(zhí)行函數(shù),直到函數(shù)結束或遇到新的斷點list<行號>|<函數(shù)名>查看指定位置代碼print

表達式|變量查看程序運行時對應表達式或變量的值quit退出gdb調試root@ubuntu:/home/jiang#gcc-gsum.cexe_sum.c-osumroot@ubuntu:/home/jiang#gdbsumGNUgdb(Ubuntu/Linaro7.4-2012.04-0ubuntu2)7.4-2012.04Copyright(C)2012FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlater<>Thisisfreesoftware:youarefreetochangeandredistributeit.ThereisNOWARRANTY,totheextentpermittedbylaw.Type"showcopying"and"showwarranty"fordetails.ThisGDBwasconfiguredas"x86_64-linux-gnu".Forbugreportinginstructions,pleasesee:<>...Readingsymbolsfrom/home/jiang/sum...done.(gdb)調試過程1.啟動調試(gdb)l1 #include<stdio.h>2 #include"sum.h"3 4 voidmain()5 {6 intx=100;7 ints=0;8 9 s=sum(x);10 (gdb)lsum//查看函數(shù)1 intsum(intn)2 {3 inti,sum=0;4 …… returnsum;2.查看文件“l(fā)(List)”(gdb)b9Breakpoint1at0x40051b:filesum.c,line9.(gdb)infobNumTypeDispEnbAddressWhat1breakpointkeepy0x000000000040051binsumatsum.c:9(gdb)d1(gdb)infobNobreakpointsorwatchpoints.3.設置斷點“b|break行號或函數(shù)名”查看斷點情況“infob”刪除斷點“delete[斷點號]”(gdb)lsum1 intsum(intn)2 {3 inti,sum=0;4 5 for(i=1;i<=100;i++)6 {7 8 sum=sum+i;9 }10 returnsum;(gdb)b8Breakpoint4,sum(n=100)atsum.c:88 sum=sum+i;(gdb)psum$1=0(gdb)pi$2=14.運行代碼“r(run)”查看變量的值“pn”5.單步運行“n(next)”若調用函數(shù),不進入函數(shù)“s(step)”若調用函數(shù),則進入函數(shù)(gdb)n5 for(i=1;i<=100;i++)(gdb)sBreakpoint4,sum(n=100)atsum.c:88 sum=sum+i;(gdb)psum$3=1(gdb)pi$4=26.恢復程序運行“c(continue)”恢復程序正常運行,把剩余未執(zhí)行的程序執(zhí)行完并顯示結果(gdb)lmain

(gdb)b9Breakpoint7at0x40051b:filesum.c,line9.(gdb)rStartingprogram:/home/jiang/sumBreakpoint7,sum(n=100)atsum.c:1010 returnsum;(gdb)cContinuing.1+2+...+100=5050[Inferior1(process13087)exitedwithcode023]為什么需要make工程管理?1個程序往往由多個文件構成;如果對其中的1個或少數(shù)幾個文件進行了修改,所有文件都需要重新編譯make工程管理器能根據makefile文件實現(xiàn)自動編譯管理,能夠根據文件時間戳自動發(fā)現(xiàn)更新過的文件而減少編譯的工作量,能大大提高軟件開發(fā)的效率make是一個命令工具,解釋makefile中的指令make工程管理器Makefile是make讀入的配置文件,包括以下內容由make工具創(chuàng)建的目標體(target),通常是目標文件或可執(zhí)行文件;要創(chuàng)建的目標體所依賴的文件;創(chuàng)建每個目標體時需要運行的命令(命令行必須以Tab鍵開頭)makefile文件格式為Makefile文件Target:dependency_files commandMakefile文件實例1/*my.h*/#include<stdio.h>/*aaa.c*/#include“my.h”voidmain(){………}源文件root@ubuntu:/home/jiang#makegcc-caaa.c-oaaa.ogccaaa.o-oaaaroot@ubuntu:/home/jiang#ls-l-rwxr-xr-x1rootroot8377aaa-rw-rw-r--1rpdzkjrpdzkj136aaa.c-rw-r--r--1rootroot64Makefile-rw-r--r--1rootroot19my.haaa:aaa.o gccaaa.o–oaaaaaa.o:aaa.cmy.h gcc-caaa.c–oaaa.oMakefile文件Makefile文件練習以P68計算1+2+…+100之和的程序為例,編寫一個Makefile文件,通過該文件實現(xiàn)對C程序文件的管理sum:sum.oexe_sum.ogccsum.oexe_sum.o-osumsum.o:sum.csum.hgcc-csum.c-osum.oexe_sum.o:exe_sum.cgcc-cexe_sum.c-oexe_sum.oMakefile變量為了簡化編輯和維護Makefile文件,允許創(chuàng)建和使用變量,用來代替一個文本字符串OBJS=sum.oexe_sum.oCC=gccsum:$(OBJS)$(CC)$(OBJS)-osumsum.o:sum.csum.h$(CC)-csum.c-osum.oexe_sum.o:exe_sum.c$(CC)-cexe_sum.c-oexe_sum.oclean:rmsum$(OBJS)Makefile自動變量為了進一步簡化編輯Makefile文件,采用自動變量代替目標文件和依賴文件。自動變量含義$*不包含擴展名的目標文件名稱$+所有的依賴文件,以空格分開,并以出現(xiàn)的先后為序,

溫馨提示

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

評論

0/150

提交評論