




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式應(yīng)用程序設(shè)計(jì)
第二章嵌入式LinuxC語(yǔ)言程序開(kāi)發(fā)工具
嵌入式Linux下C語(yǔ)言概述2.2編輯器vim2.3編譯器gcc2.4調(diào)試器GDB2.5make工程管理器2.6autotools小結(jié)2.9思考與練習(xí)本章課程:2023/1/122嵌入式Linux下C語(yǔ)言概述C語(yǔ)言最早是由貝爾實(shí)驗(yàn)室的DennisRitchie為了UNIX的輔助開(kāi)發(fā)而編寫(xiě)的,它是在B語(yǔ)言的基礎(chǔ)上開(kāi)發(fā)出來(lái)的。盡管C語(yǔ)言不是專(zhuān)門(mén)針對(duì)UNIX操作系統(tǒng)或機(jī)器編寫(xiě)的,但它與UNIX系統(tǒng)的關(guān)系十分緊密。由于它的硬件無(wú)關(guān)性和可移植性,使C語(yǔ)言逐漸成為世界上使用最廣泛計(jì)算機(jī)語(yǔ)言。2023/1/1232.1嵌入式Linux下C語(yǔ)言概述C語(yǔ)言有如下特點(diǎn):C語(yǔ)言是“中級(jí)語(yǔ)言”。它把高級(jí)語(yǔ)言的基本結(jié)構(gòu)和語(yǔ)句與低級(jí)語(yǔ)言的實(shí)用性結(jié)合起來(lái)。
C語(yǔ)言是結(jié)構(gòu)化的語(yǔ)言。
C語(yǔ)言功能齊全。
C語(yǔ)言可移植性強(qiáng)。2023/1/124嵌入式Linux下C語(yǔ)言概述編輯器常用的編輯器有vi(vim)和Emacs編譯鏈接器常用的編譯器是GCC編譯器調(diào)試器GDB項(xiàng)目管理器項(xiàng)目管理器make2023/1/1252.2編輯器vim2.2.1vi的基本模式2.2.2vi的基本操作2023/1/1262.2.1vi的基本模式標(biāo)準(zhǔn)模式(Normalmode)通常進(jìn)入vim后默認(rèn)處于標(biāo)準(zhǔn)模式(或者稱(chēng)為命令模式)。在此模式下任何鍵盤(pán)的輸入都是作為命令來(lái)對(duì)待。命令的輸入通常是不回顯的,只顯示執(zhí)行的結(jié)果。插入模式(InsertMode)用戶(hù)只有在插入模式下才可以進(jìn)行字符輸入,用戶(hù)按[Esc]鍵可回到命令行模式下。命令行模式(Command-linemode)在此模式下,用戶(hù)可以將文件保存或退出vim,也可以設(shè)置編輯環(huán)境,如尋找字符串、列出行號(hào)等??梢暷J剑╒isualmode)在此模式下,通過(guò)移動(dòng)光標(biāo)選擇文本,選中的文本將反白顯示,這樣提供高效、直觀的編輯功能。用戶(hù)按下ESC鍵可回到命令行模式。2023/1/1272.2.2vi的基本操作1.vim的進(jìn)入、保存和退出進(jìn)入vim可以直接在命令終端下鍵入vim<文件名>,vim可以自動(dòng)載入所要編輯的文件或是開(kāi)啟一個(gè)新的文件。如在shell中鍵入vim(新建文件)則可進(jìn)入vim環(huán)境。進(jìn)入vi后屏幕左方會(huì)出現(xiàn)波浪符號(hào),凡是具有該符號(hào)就代表此列目前是空的。此時(shí)進(jìn)入的是命令行模式。要退出vim可以在命令行模式下鍵入“:q”(不保存并退出)或“:q!”(不保存并強(qiáng)制退出)或“:wq”(保存并退出)指令則是保存之后再離開(kāi)(注意冒號(hào))。2023/1/1282.2.2vi的基本操作命令類(lèi)別命令說(shuō)明編輯:efilename編輯文件名為filename的文件。若這個(gè)文件不存在,則會(huì)開(kāi)啟一個(gè)名為filename的新文件的編輯保存:w保存文件,文件應(yīng)已有名字:wfilename以文件名filename保存文件退出:q退出,如果文件已修改則不能退出:q!不保存強(qiáng)行推出,無(wú)論文件是否被修改:wq保存后退出2023/1/1292.2.2vi的基本操作2.光標(biāo)的移動(dòng)除了使用標(biāo)準(zhǔn)光標(biāo)鍵移動(dòng)光標(biāo)之外,vim還提供了很多復(fù)雜的光標(biāo)移動(dòng)方式。命令類(lèi)別命令說(shuō)明基本操作h,j,k,l分別等同于左方向鍵、下方向鍵、上方向鍵、右方向健字操作w移至下一個(gè)單詞的字首e移至下一個(gè)單詞的字尾b移至上一個(gè)單詞的字首行操作0移至行首$移至行尾G移至文件尾部gg移至文件首部H移至當(dāng)前屏幕頂部M移至當(dāng)前屏幕中間行的行首L移至當(dāng)前屏幕底部最后一行的行首n-向上移動(dòng)n行n+向下移動(dòng)n行nG移至第n行頁(yè)操作Ctrl+f屏幕往“上”翻動(dòng)一頁(yè),等同于PageUpCtrl+b屏幕往“下”翻動(dòng)一頁(yè),等同于PageDownCtrl+u屏幕往“上”翻動(dòng)半頁(yè)Ctrl+d屏幕往“下”翻動(dòng)半頁(yè)2023/1/12102.2.2vi的基本操作3.文本編輯文本編輯包括輸入、修改、復(fù)制、粘貼、刪除(可以用Del鍵和Backspace鍵)和恢復(fù)等操作。命令類(lèi)別命令說(shuō)明修改r修改光標(biāo)所在的字符,鍵入r后直接鍵入待修改字符R進(jìn)入取代狀態(tài),在光標(biāo)所指定的位置修改字符,該替代狀態(tài)直到按下ESC鍵才結(jié)束復(fù)制yy復(fù)制光標(biāo)所在行nyy復(fù)制光標(biāo)所在行開(kāi)始的n行,如3yy表示復(fù)制三行y^復(fù)制光標(biāo)至行首y$復(fù)制光標(biāo)至行尾yw復(fù)制一個(gè)字(單詞)yG復(fù)制光標(biāo)文件尾y1G復(fù)制光標(biāo)文件首粘貼p粘貼至光標(biāo)后P粘貼至光標(biāo)前刪除x刪除光標(biāo)所在位置的一個(gè)字符X刪除光標(biāo)所在位置的前一個(gè)字符s刪除光標(biāo)所在的字符,并進(jìn)入輸入模式S刪除光標(biāo)所在的行,并進(jìn)入輸入模式dd刪除光標(biāo)所在的行ndd從光標(biāo)所在行開(kāi)始向下刪除n行D刪除至行尾,等同于d$dG刪除至文件尾部d1G刪除至文件首部,等同于dgg恢復(fù)u撤銷(xiāo)上一步的操作??梢远啻纬蜂N(xiāo)U在光標(biāo)離開(kāi)之前,恢復(fù)所有的編輯操作Ctrl+r返回至撤銷(xiāo)操作之前的狀態(tài)2023/1/12112.2.2vi的基本操作4.查找與替換vim的查找和替換功能都支持正則表達(dá)式,可以匹配非常復(fù)雜的關(guān)鍵字,功能非常強(qiáng)大。類(lèi)別命令說(shuō)明查找/<要查找的字符>向下查找要查找的字符?<要查找的字符>向上查找要查找的字符n繼續(xù)查找N反向查找替換:[range]s/pattern/string/[c,e,g,i]range:指定查找的范圍。例如1,$指替換范圍從第0行到最后一行;s:指轉(zhuǎn)入替換模式;pattern:指要被替換的字符串,可以用正則表達(dá)式;string:指替換的字符串;c:每次替換前詢(xún)問(wèn);e:不顯示錯(cuò)誤;g:強(qiáng)制整行替換;i:不區(qū)分大小寫(xiě)2023/1/12122.3編譯器gcc
2.3.1GCC的簡(jiǎn)介2.3.2GCC的編譯流程2.3.3GCC的常用編譯選項(xiàng)2023/1/12132.3.1GCC的簡(jiǎn)介GNUCC(簡(jiǎn)稱(chēng)為gcc)是GNU項(xiàng)目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語(yǔ)言編寫(xiě)的程序。gcc不僅功能強(qiáng)大,而且可以編譯如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多種語(yǔ)言,而且gcc又是一個(gè)交叉平臺(tái)編譯器,支持的硬件平臺(tái)很多,如alpha、arm、avr、hppa、i386、m68k、mips、powerpc、sparc、vxworks、x86_64、MSWindows、OS/2等等。它能夠在當(dāng)前CPU平臺(tái)上為多種不同體系結(jié)構(gòu)的硬件平臺(tái)開(kāi)發(fā)軟件,因此尤其適合在嵌入式領(lǐng)域的開(kāi)發(fā)編譯。2023/1/12142.3.1GCC的簡(jiǎn)介gcc的編譯流程分為了4個(gè)步驟,分別為:預(yù)處理(Pre-Processing)編譯(Compiling)匯編(Assembling)鏈接(Linking)后綴名所對(duì)應(yīng)的語(yǔ)言編譯流程.cC原始程序預(yù)處理、編譯、匯編.C/.cc/.cxxC++原始程序預(yù)處理、編譯、匯編.mObjective-C原始程序預(yù)處理、編譯、匯編.i已經(jīng)過(guò)預(yù)處理的C原始程序編譯、匯編.ii已經(jīng)過(guò)預(yù)處理的C++原始程序編譯、匯編.s/.S匯編語(yǔ)言原始程序匯編.h預(yù)處理文件(頭文件)(不常出現(xiàn)在指令行).o目標(biāo)文件鏈接.a/.so編譯后的庫(kù)文件鏈接2023/1/12152.3.1GCC的簡(jiǎn)介GCC使用的基本語(yǔ)法為:
gcc[option|filename]2023/1/12162.3.2GCC的編譯流程預(yù)處理階段處理的主要作用是通過(guò)預(yù)處理的內(nèi)建功能對(duì)一些可預(yù)處理資源進(jìn)行等價(jià)替換,最常見(jiàn)的可預(yù)處理資源有:文件包含、條件編譯、布局控制和宏處理等。gcc的選項(xiàng)“-E”可以使編譯器在預(yù)處理結(jié)束時(shí)就停止編譯,選項(xiàng)“-o”是指定GCC輸出的結(jié)果,其命令格式為如下所示。gcc–E–o[目標(biāo)文件][編譯文件]例如:$gcc–E–o2023/1/12172.3.2GCC的編譯流程編譯階段編譯器在預(yù)處理結(jié)束之后,gcc首先要檢查代碼的規(guī)范性、是否有語(yǔ)法錯(cuò)誤等,以確定代碼的實(shí)際要做的工作,在檢查無(wú)誤后,就開(kāi)始把代碼翻譯成匯編語(yǔ)言,gcc的選項(xiàng)“-S”能使編譯器在進(jìn)行匯編之前就停止。由表可知,“.s”是匯編語(yǔ)言原始程序,因此,此處的目標(biāo)文件就可設(shè)為“.s”類(lèi)型。$gcc–S–o2023/1/12182.3.2GCC的編譯流程匯編階段匯編階段是把編譯階段生成的“.s”文件生成目標(biāo)文件,讀者在此使用選項(xiàng)“-c”就可看到匯編代碼已轉(zhuǎn)化為“.o”的二進(jìn)制目標(biāo)代碼了。如下所示。$gcc–c–o2023/1/12192.3.2GCC的編譯流程鏈接階段。完成了鏈接之后,gcc就可以生成可執(zhí)行文件,其命令如下所示。$gcc–ohello運(yùn)行該可執(zhí)行文件,出現(xiàn)正確的結(jié)果。$./hellohello,embeddedworld2023/1/12202.3.3gcc的常用編譯選項(xiàng)gcc有超過(guò)100個(gè)的可用選項(xiàng),包括總體選項(xiàng)、警告和出錯(cuò)選項(xiàng)、優(yōu)化選項(xiàng)和體系結(jié)構(gòu)等相關(guān)選項(xiàng)。(1)常用選項(xiàng)選項(xiàng)含義-c只編譯匯編不鏈接,生成目標(biāo)文件“.o”-S只編譯不匯編,生成匯編代碼-E只進(jìn)行預(yù)編譯,不做其他處理-g在可執(zhí)行程序中包含標(biāo)準(zhǔn)調(diào)試信息-ofile將file文件指定為輸出文件-v打印出編譯器內(nèi)部編譯各過(guò)程的命令行信息和編譯器的版本-Idir在頭文件的搜索路徑列表中添加dir目錄2023/1/12212.3.3gcc的常用編譯選項(xiàng)(2)庫(kù)相關(guān)選項(xiàng)選項(xiàng)含義-static進(jìn)行靜態(tài)編譯,即鏈接靜態(tài)庫(kù),禁止鏈接動(dòng)態(tài)庫(kù)-shared1.可以生成動(dòng)態(tài)庫(kù)文件2.進(jìn)行動(dòng)態(tài)編譯,盡可能地鏈接動(dòng)態(tài)庫(kù),只有當(dāng)沒(méi)有動(dòng)態(tài)庫(kù)時(shí)才會(huì)鏈接同名的靜態(tài)庫(kù)(默認(rèn)選項(xiàng),即可省略)-Ldir在庫(kù)文件的搜索路徑列表中添加dir目錄-lname鏈接稱(chēng)為libname.a(靜態(tài)庫(kù))或者libname.so(動(dòng)態(tài)庫(kù))的庫(kù)文件。若兩個(gè)庫(kù)都存在,則根據(jù)編譯方式(-static還是-shared)而進(jìn)行鏈接-fPIC(或-fpic)生成使用相對(duì)地址的位置無(wú)關(guān)的目標(biāo)代碼(PositionIndependentCode)。然后通常使用gcc的-static選項(xiàng)從該P(yáng)IC目標(biāo)文件生成動(dòng)態(tài)庫(kù)文件。2023/1/12222.3.3gcc的常用編譯選項(xiàng)(3)警告和出錯(cuò)選項(xiàng)選項(xiàng)含義-ansi支持符合ANSI標(biāo)準(zhǔn)的C程序-pedantic允許發(fā)出ANSIC標(biāo)準(zhǔn)所列的全部警告信息-pedantic-error允許發(fā)出ANSIC標(biāo)準(zhǔn)所列的全部錯(cuò)誤信息-w關(guān)閉所有警告信息-Wall允許發(fā)出gcc提供的所有有用的報(bào)警信息-werror把所有的警告信息轉(zhuǎn)化為錯(cuò)誤信息,并在警告發(fā)生時(shí)終止編譯過(guò)程2023/1/12232.3.3gcc的常用編譯選項(xiàng)(4)優(yōu)化選項(xiàng)gcc可以對(duì)代碼進(jìn)行優(yōu)化,它通過(guò)編譯選項(xiàng)“-On”來(lái)控制優(yōu)化代碼的生成,其中n是一個(gè)代表優(yōu)化級(jí)別的整數(shù)。對(duì)于不同版本的gcc來(lái)講,n的取值范圍及其對(duì)應(yīng)的優(yōu)化效果可能并不完全相同,比較典型的范圍是從0變化到2或32023/1/12242.3.3gcc的常用編譯選項(xiàng)(5)體系結(jié)構(gòu)相關(guān)選項(xiàng)選項(xiàng)含義-mcpu=type針對(duì)不同的CPU使用相應(yīng)的CPU指令??蛇x擇的type有i386、i486、pentium及i686等-mieee-fp使用IEEE標(biāo)準(zhǔn)進(jìn)行浮點(diǎn)數(shù)的比較-mno-ieee-fp不使用IEEE標(biāo)準(zhǔn)進(jìn)行浮點(diǎn)數(shù)的比較-msoft-float輸出包含浮點(diǎn)庫(kù)調(diào)用的目標(biāo)代碼-mshort把int類(lèi)型作為16位處理,相當(dāng)于shortint-mrtd強(qiáng)行將函數(shù)參數(shù)個(gè)數(shù)固定的函數(shù)用retNUM返回,節(jié)省調(diào)用函數(shù)的一條指令2023/1/12252.4調(diào)試器GDBGDB是GNU開(kāi)源組織發(fā)布的一個(gè)強(qiáng)大的Linux下的程序調(diào)試工具,它是一種強(qiáng)大的命令行調(diào)試工具。一個(gè)合格的調(diào)試器需要有以下幾項(xiàng)基本功能。能夠運(yùn)行程序,設(shè)置所有能影響程序運(yùn)行的參數(shù)。能夠讓程序讓指定的條件下停止。能夠在程序停止時(shí)檢查所有參數(shù)的情況。能夠根據(jù)指定條件改變程序的運(yùn)行。2023/1/12262.4.1gdb使用流程進(jìn)入GDB——gdbtest查看文件——l設(shè)置斷點(diǎn)——b6查看斷點(diǎn)處情況——infob運(yùn)行代碼——r查看變量值——pn/pi單步運(yùn)行——n恢復(fù)程序運(yùn)行——c觀察變量——watchn
退出GDB
——q2023/1/12272.4.2gdb基本命令1.工作環(huán)境相關(guān)命令命令格式含義setargs運(yùn)行時(shí)的參數(shù)指定運(yùn)行時(shí)參數(shù),如setargs2showargs查看設(shè)置好的運(yùn)行參數(shù)pathdir設(shè)定程序的運(yùn)行路徑showpaths查看程序的運(yùn)行路徑setenvironmentvar[=value]設(shè)置環(huán)境變量showenvironment[var]查看環(huán)境變量cddir進(jìn)入到dir目錄,相當(dāng)于shell中的cd命令pwd顯示當(dāng)前工作目錄shellcommand運(yùn)行shell的command命令2023/1/12282.4.2gdb基本命令2.設(shè)置斷點(diǎn)與恢復(fù)命令命令格式含義infob查看所設(shè)斷點(diǎn)break[文件名:]行號(hào)或函數(shù)名<條件表達(dá)式>設(shè)置斷點(diǎn)tbreak[文件名:]行號(hào)或函數(shù)名<條件表達(dá)式>設(shè)置臨時(shí)斷點(diǎn),到達(dá)后被自動(dòng)刪除delete[斷點(diǎn)號(hào)]刪除指定斷點(diǎn),其斷點(diǎn)號(hào)為“infob”中的第一欄。若缺省斷點(diǎn)號(hào)則刪除所有斷點(diǎn)disable[斷點(diǎn)號(hào)]停止指定斷點(diǎn),使用“infob”仍能查看此斷點(diǎn)。同delete一樣,若缺省斷點(diǎn)號(hào)則停止所有斷點(diǎn)enable[斷點(diǎn)號(hào)]激活指定斷點(diǎn),即激活被disable停止的斷點(diǎn)condition[斷點(diǎn)號(hào)]<條件表達(dá)式>修改對(duì)應(yīng)斷點(diǎn)的條件ignore[斷點(diǎn)號(hào)]<num>在程序執(zhí)行中,忽略對(duì)應(yīng)斷點(diǎn)num次step單步恢復(fù)程序運(yùn)行,且進(jìn)入函數(shù)調(diào)用next單步恢復(fù)程序運(yùn)行,但不進(jìn)入函數(shù)調(diào)用finish運(yùn)行程序,直到當(dāng)前函數(shù)完成返回c繼續(xù)執(zhí)行函數(shù),直到函數(shù)結(jié)束或遇到新的斷點(diǎn)2023/1/12292.4.2gdb基本命令3.gdb中源碼查看相關(guān)命令命令格式含義list<行號(hào)>|<函數(shù)名>查看指定位置代碼file[文件名]加載指定文件forward-search正則表達(dá)式源代碼的前向搜索reverse-search正則表達(dá)式源代碼的后向搜索dirDIR將路徑DIR添加到源文件搜索的路徑的開(kāi)頭showdirectories顯示源文件的當(dāng)前搜索路徑infoline顯示加載到gdb內(nèi)存中的代碼2023/1/12302.4.2gdb基本命令4.gdb中查看運(yùn)行數(shù)據(jù)相關(guān)命令命令格式含義print表達(dá)式|變量查看程序運(yùn)行時(shí)對(duì)應(yīng)表達(dá)式和變量的值x<n/f/u>查看內(nèi)存變量?jī)?nèi)容。其中n為整數(shù)表示顯示內(nèi)存的長(zhǎng)度,f表示顯示的格式,u表示從當(dāng)前地址往后請(qǐng)求顯示的字節(jié)數(shù)display表達(dá)式設(shè)定在單步運(yùn)行或其他情況中,自動(dòng)顯示的對(duì)應(yīng)表達(dá)式的內(nèi)容backtrace或bt查看當(dāng)前棧偵的情況,即可以查到哪些被調(diào)用的函數(shù)尚未返回。framen打印第n個(gè)棧偵inforeg/stack查看寄存器/堆棧使用情況up調(diào)到上一層函數(shù),即上移棧幀down與up相對(duì),即下移棧幀2023/1/12312.4.2gdb基本命令5.gdb中修改運(yùn)行參數(shù)相關(guān)命令gdb還可以修改運(yùn)行時(shí)的參數(shù),并使該變量按照用戶(hù)當(dāng)前輸入的值繼續(xù)運(yùn)行。它的設(shè)置方法為:在單步執(zhí)行的過(guò)程中,鍵入命令“set變量=設(shè)定值”。2023/1/12322.4.3gdbserver遠(yuǎn)程調(diào)試在嵌入式系統(tǒng)開(kāi)發(fā)中,我們經(jīng)常通過(guò)使用交叉調(diào)試工具實(shí)現(xiàn)遠(yuǎn)程調(diào)試。采用遠(yuǎn)程調(diào)試的主要原因是大多數(shù)嵌入式平臺(tái)不太適合進(jìn)行本地調(diào)試,在很多嵌入式平臺(tái)上內(nèi)存等資源受限制,并且附帶調(diào)試信息的可執(zhí)行程序往往超過(guò)幾兆字節(jié)大小。使用交叉調(diào)試,可以減輕嵌入式平臺(tái)的這些負(fù)擔(dān)。gdb調(diào)試器提供了兩種不同的遠(yuǎn)程調(diào)試方法,即stub(插樁)方式和gdbserver方式。這兩種遠(yuǎn)程調(diào)試方式是有區(qū)別的。gdbserver本身的體積很小,能夠在具有很小內(nèi)存的目標(biāo)系統(tǒng)上獨(dú)立運(yùn)行,因而非常適合嵌入式開(kāi)發(fā)。stub方式則需要通過(guò)鏈接器把調(diào)試代理和要調(diào)試的程序鏈接成一個(gè)可執(zhí)行的應(yīng)用程序文件,而且stub需要修改異常處理和驅(qū)動(dòng)程序等。但gdbserver要求宿主機(jī)和目標(biāo)系統(tǒng)采用同一系列的操作系統(tǒng),而stub沒(méi)有這種限制,甚至目標(biāo)系統(tǒng)可以沒(méi)有操作系統(tǒng)。gdbserver比較適合于調(diào)試嵌入式平臺(tái)上的應(yīng)用程序,而stub比較適合于調(diào)試bootloader和內(nèi)核等系統(tǒng)程序。2023/1/12332.4.3gdbserver遠(yuǎn)程調(diào)試用gdb+gdbserver的方式調(diào)試嵌入式平臺(tái)上的Linux應(yīng)用程序安裝arm-linux-gdb安裝gdbserver遠(yuǎn)程調(diào)試2023/1/12342.5make工程管理器2.5.1Makefile基本結(jié)構(gòu)2.5.2Makefile變量2.5.3Makefile規(guī)則2.5.4make管理器的使用2023/1/12352.5.1Makefile基本結(jié)構(gòu)在一個(gè)Makefile中通常包含如下內(nèi)容。需要由make工具創(chuàng)建的目標(biāo)體(target),目標(biāo)體通常是目標(biāo)文件、可執(zhí)行文件或是一個(gè)標(biāo)簽。要?jiǎng)?chuàng)建的目標(biāo)體所依賴(lài)的文件(dependency_file)。創(chuàng)建每個(gè)目標(biāo)體時(shí)需要運(yùn)行的命令(command)。它的格式為:
target:dependency_filescommand2023/1/12362.5.2Makefile變量命令格式含義AR庫(kù)文件維護(hù)程序的名稱(chēng),默認(rèn)值為arAS匯編程序的名稱(chēng),默認(rèn)值為asCCC編譯器的名稱(chēng),默認(rèn)值為ccCPPC預(yù)編譯器的名稱(chēng),默認(rèn)值為$(CC)–ECXXC++編譯器的名稱(chēng),默認(rèn)值為g++FCFORTRAN編譯器的名稱(chēng),默認(rèn)值為f77RM文件刪除程序的名稱(chēng),默認(rèn)值為rm–fARFLAGS庫(kù)文件維護(hù)程序的選項(xiàng),無(wú)默認(rèn)值A(chǔ)SFLAGS匯編程序的選項(xiàng),無(wú)默認(rèn)值CFLAGSC編譯器的選項(xiàng),無(wú)默認(rèn)值CPPFLAGSC預(yù)編譯的選項(xiàng),無(wú)默認(rèn)值CXXFLAGSC++編譯器的選項(xiàng),無(wú)默認(rèn)值FFLAGSFORTRAN編譯器的選項(xiàng),無(wú)默認(rèn)值Makefile中常見(jiàn)預(yù)定義變量2023/1/12372.5.2Makefile變量命令格式含義$*不包含擴(kuò)展名的目標(biāo)文件名稱(chēng)$+所有的依賴(lài)文件,以空格分開(kāi),并以出現(xiàn)的先后為序,可能包含重復(fù)的依賴(lài)文件$<第一個(gè)依賴(lài)文件的名稱(chēng)$?所有時(shí)間戳比目標(biāo)文件晚的依賴(lài)文件,并以空格分開(kāi)$@目標(biāo)文件的完整名稱(chēng)$^所有不重復(fù)的依賴(lài)文件,以空格分開(kāi)$%如果目標(biāo)是歸檔成員,則該變量表示目標(biāo)的歸檔成員名稱(chēng)Makefile中常見(jiàn)自動(dòng)變量2023/1/12382.5.3Makefile規(guī)則隱式規(guī)則隱含規(guī)則能夠告訴make怎樣使用傳統(tǒng)的技術(shù)完成任務(wù),這樣,當(dāng)用戶(hù)使用它們時(shí)就不必詳細(xì)指定編譯的具體細(xì)節(jié),而只需把目標(biāo)文件列出即可。make會(huì)自動(dòng)搜索隱式規(guī)則目錄來(lái)確定如何生成目標(biāo)文件。
make的隱式規(guī)則指出:所有“.o”文件都可自動(dòng)由“.c”文件使用命令“$(CC)$(CPPFLAGS)$(CFLAGS)-c–o”生成。2023/1/12392.5.3Makefile規(guī)則隱式規(guī)則對(duì)應(yīng)語(yǔ)言后綴名規(guī)則C編譯:.c變?yōu)?o$(CC)–c$(CPPFLAGS)$(CFLAGS)C++編譯:.cc或.C變?yōu)?o$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)Pascal編譯:.p變?yōu)?o$(PC)-c$(PFLAGS)Fortran編譯:.r變?yōu)?o$(FC)-c$(FFLAGS)。Makefile中常見(jiàn)隱式規(guī)則目錄2023/1/12402.5.3Makefile規(guī)則模式規(guī)則模式規(guī)則不同于隱式規(guī)則,是用來(lái)定義相同處理規(guī)則的多個(gè)文件的,模式規(guī)則能引入用戶(hù)自定義變量,為多個(gè)文件建立相同的規(guī)則,簡(jiǎn)化Makefile的編寫(xiě)。模式規(guī)則的格式類(lèi)似于普通規(guī)則,這個(gè)規(guī)則中的相關(guān)文件前必須用“%”標(biāo)明。OBJS=CC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)
$(CC)$^-o$@%.o:%.c
$(CC)$(CFLAGS)-c$<-o$@2023/1/12412.5.4make使用命令格式含義-Cdir讀入指定目錄下的Makefile-ffile讀入當(dāng)前目錄下的file文件作為Makefile-i忽略所有的命令執(zhí)行錯(cuò)誤-Idir指定被包含的Makefile所在目錄-n只打印要執(zhí)行的命令,但不執(zhí)行這些命令-p顯示make變量數(shù)據(jù)庫(kù)和隱含規(guī)則-s在執(zhí)行命令時(shí)不顯示命令-w如果make在執(zhí)行過(guò)程中改變目錄,打印當(dāng)前目錄名2023/1/12422.6autotoolsautotools系列工具只需用戶(hù)輸入簡(jiǎn)單的目標(biāo)文件、依賴(lài)文件、文件目錄等就可以輕松地生成makefile了這些工具還可以完成系統(tǒng)配置信息的收集,從而可以方便地處理各種移植性的問(wèn)題。2023/1/12432.6.1autotools使用流程2023/1/12442.6.2使用autotools所生成的makefileautotools生成的makefile除具有普通的編譯功能外,還具有以下主要功能:makemakeinstallmakecleanmakedist2023/1/12452.7實(shí)驗(yàn)內(nèi)容2.7.1vim使用練習(xí)2.7.2用gdb調(diào)試程序的bug2.7.3編寫(xiě)包含多文件的makefile2.7.4使用autotools生成包含多文件的makefile2023/1/12462.7.1vim使用練習(xí)實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)指定指令的vim操作練習(xí),使讀者能夠熟練使用vim中的常見(jiàn)操作,并且熟悉vim的幾種模式,如果讀者能夠熟練掌握實(shí)驗(yàn)內(nèi)容中所要求的內(nèi)容,則表明對(duì)vim的操作已經(jīng)很熟練了。實(shí)驗(yàn)內(nèi)容(11)將光標(biāo)移動(dòng)到最后一行的行尾。(12)粘貼復(fù)制行的內(nèi)容。(13)光標(biāo)移到“”。(14)刪除該行。(15)存盤(pán)但不退出。(16)將光標(biāo)移到首行。(17)插入模式下輸入“Hello,thisisviworld!”。(18)返回命令行模式。(19)向下查找字符串“0:wait”。(20)再向上查找字符串“halt”。(21)強(qiáng)制退出vim,不存盤(pán)。(1)在“/root”目錄下建一個(gè)名為“vim”的目錄。(2)進(jìn)入“vim”目錄。(3)將文件“/etc/inittab”復(fù)制到“vim”目錄下。(4)使用vim打開(kāi)“vim”目錄下的inittab。(5)設(shè)定行號(hào),指出設(shè)定initdefault(類(lèi)似于“id:5:initdefault”)的所在行號(hào)。(6)將光標(biāo)移到該行。(7)復(fù)制該行內(nèi)容。(8)將光標(biāo)移到最后一行行首。(9)粘貼復(fù)制行的內(nèi)容。(10)撤銷(xiāo)第9步的動(dòng)作。分別指出每個(gè)命令處于何種模式下?2023/1/12472.7.2用gdb調(diào)試程序的bug實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)調(diào)試一個(gè)有問(wèn)題的程序,使讀者進(jìn)一步熟練使用vi操作,而且熟練掌握gcc編譯命令及gdb的調(diào)試命令,通過(guò)對(duì)有問(wèn)題程序的跟蹤調(diào)試,進(jìn)一步提高發(fā)現(xiàn)問(wèn)題和解決問(wèn)題的能力。這是一個(gè)很小的程序,希望讀者認(rèn)真調(diào)試。實(shí)驗(yàn)內(nèi)容(1)使用vi編輯器,將以下代碼輸入到名為的文件中。(2)使用gcc編譯這段代碼,注意要加上“-g”選項(xiàng)以方便之后的調(diào)試。(3)運(yùn)行生成的可執(zhí)行文件,觀察運(yùn)行結(jié)果。(4)使用gdb調(diào)試程序,通過(guò)設(shè)置斷點(diǎn)、單步跟蹤,一步步找出錯(cuò)誤所在。(5)糾正錯(cuò)誤,更改源程序并得到正確的結(jié)果。
2023/1/12482.7.3編寫(xiě)包含多文件的makefile實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)對(duì)包含多文件的makefile的編寫(xiě),熟悉各種形式的makefile,并且進(jìn)一步加深對(duì)makefile中用戶(hù)自定義變量、自動(dòng)變量及預(yù)定義變量的理解。實(shí)驗(yàn)內(nèi)容(1)用vi在同一目錄下編輯兩個(gè)簡(jiǎn)單的hello程序(2)仍在同一目錄下用vim編輯makefile,且不使用變量替換,用一個(gè)目標(biāo)體實(shí)現(xiàn)(即直接將和編譯成hello目標(biāo)體)。然后用make驗(yàn)證所編寫(xiě)的makefile是否正確。(3)將上述makefile使用變量替換實(shí)現(xiàn)。同樣用make驗(yàn)證所編寫(xiě)的makefile是否正確。(4)編輯另一個(gè)makefile,取名為makefile1,不使用變量替換,但用兩個(gè)目標(biāo)體實(shí)現(xiàn)(也就是首先將和編譯為,再將編譯為hello),再用make的“-f”選項(xiàng)驗(yàn)證這個(gè)makefile1的正確性。(5)將上述makefile1使用變量替換實(shí)現(xiàn)。2023/1/12492.7.4使用autotools生成包含多文件的makefile實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)使用autotools生成包含多文件的makefile,進(jìn)一步掌握autotools的使用方法。同時(shí),掌握Linux下安裝軟件的常用方法。實(shí)驗(yàn)過(guò)程(9)使用automake生成。(10)使用configure生成makefile。(11)使用make生成hello可執(zhí)行文件,并在當(dāng)前目錄下運(yùn)行hello查看結(jié)果。(12)使用makeinstall將hello安裝到系統(tǒng)目錄下,并運(yùn)行,查看結(jié)果。(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 哈爾濱醫(yī)科大學(xué)《書(shū)畫(huà)裝裱》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東工程職業(yè)技術(shù)學(xué)院《工程招投標(biāo)與概預(yù)算》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇航運(yùn)職業(yè)技術(shù)學(xué)院《中學(xué)語(yǔ)文教學(xué)設(shè)計(jì)與技能訓(xùn)練(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 黑龍江司法警官職業(yè)學(xué)院《模擬電子技術(shù)課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東司法警官職業(yè)學(xué)院《數(shù)字特效合成》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津工藝美術(shù)職業(yè)學(xué)院《衛(wèi)生檢驗(yàn)綜合技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 東莞職業(yè)技術(shù)學(xué)院《計(jì)算機(jī)與操作系統(tǒng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 武漢工程科技學(xué)院《外國(guó)文學(xué)名篇》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025三年級(jí)湘教版語(yǔ)文下學(xué)期期末知識(shí)點(diǎn)歸納復(fù)習(xí)周末練習(xí)單
- PROMIS-評(píng)分量表-使用版
- 《柔性棚洞防護(hù)結(jié)構(gòu)技術(shù)規(guī)程》
- 危險(xiǎn)廢物綜合利用與處置技術(shù)規(guī)范 通則
- 植物組織培養(yǎng)技術(shù)應(yīng)用研究進(jìn)展
- 教育心理學(xué)課件(完整版)
- YYT 1898-2024 血管內(nèi)導(dǎo)管導(dǎo)絲 親水性涂層牢固度試驗(yàn)方法
- 2023年安徽電氣工程職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能試題及答案解析
- JIS-D1601-1995-汽車(chē)零部件振動(dòng)試驗(yàn)方法
- 高血壓腎病護(hù)理查房課件
- 基坑開(kāi)挖影響周邊環(huán)境與建筑物研究
- 《民事訴訟法》課件
- 環(huán)保合規(guī)與企業(yè)風(fēng)險(xiǎn)管理
評(píng)論
0/150
提交評(píng)論