版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Linux開發(fā)基礎(chǔ)原倉周第二章Linux程序設(shè)計基礎(chǔ)—C環(huán)境Linux編程概述文本編輯器viLinux下函數(shù)庫GCC及其使用調(diào)試工具gdbGNUmake和makefileLinux編程概述
Linux軟件開發(fā)一直在Internet環(huán)境下講行。這個環(huán)境是全球性的,編程人員來自世界各地。只要能夠訪問Web站點(diǎn),就可以啟動一個以Linux為基礎(chǔ)的軟件項(xiàng)目。Linux開發(fā)工作經(jīng)常是在Linux用戶決定共同完成一個項(xiàng)目時開始的。當(dāng)開發(fā)工作完成后,該軟件就被放到Internet站點(diǎn)上,任何用戶都可以訪問和下載它。由于這個活躍的開發(fā)環(huán)境,新的以Linux為基礎(chǔ)的軟件功能日益強(qiáng)大,而且呈現(xiàn)爆炸式的增長態(tài)勢。大多數(shù)Linux軟件是經(jīng)過自由軟件基金會(FreeSoftwareFoundation)提供的GNU(GNU即GNU’snotUNIX)公開認(rèn)證授權(quán)的,因而通常被稱作GNU軟件。GNU軟件免費(fèi)提供給用戶使用,并被證明是非常可靠和高效的。許多流行的Linux實(shí)用程序如C編譯器、shell和編輯器都是GNU軟件應(yīng)用程序。
Linux程序需要首先轉(zhuǎn)化為低級機(jī)器語言即所謂的二進(jìn)制代碼以后,才能被操作系統(tǒng)執(zhí)行。例如編程時,先用普通的編程語言生成一系列指令,這些指令可被翻譯為適當(dāng)?shù)目蓤?zhí)行應(yīng)用程序的二進(jìn)制代碼。這個翻譯過程可由解釋器一步步來完成,或者也可以立即由編譯器明確地完成。shell編程語言如BASH、TCSH、GAWK、Perl、Tcl和Tk都利用自己的解釋器。用這些語言編制的程序盡管是應(yīng)用程序文件,但可以直接運(yùn)行。編譯器則不同,它將生成一個獨(dú)立的二進(jìn)制代碼文件然后才可以運(yùn)行。Linux編程風(fēng)格GNU風(fēng)格Linux內(nèi)核編程風(fēng)格GNU風(fēng)格(1/2)函數(shù)返回類型說明和函數(shù)名分兩行放置,函數(shù)起始字符和函數(shù)開頭左花括號放到最左邊。盡量不要讓兩個不同優(yōu)先級的操作符出現(xiàn)在相同的對齊方式中,應(yīng)該附加額外的括號使得代碼縮進(jìn)可以表示出嵌套。按照如下方式排版do-while語句:do{}while()每個程序都應(yīng)該以一段簡短的說明其功能的注釋開頭。請為每個函數(shù)書寫注釋,說明函數(shù)是做什么的,需要哪些入口參數(shù),參數(shù)可能值的含義和用途。如果用了非常見的、非標(biāo)準(zhǔn)的東西,或者可能導(dǎo)致函數(shù)不能工作的任何可能的值,應(yīng)該進(jìn)行特殊說明。如果存在重要的返回值,也需要說明。不要聲明多個變量時跨行,每一行都以一個新的聲明開頭。GNU風(fēng)格(2/2)當(dāng)一個if中嵌套了另一個if-else時,應(yīng)用花括號把if-else括起來。要在同一個聲明中同時說明結(jié)構(gòu)標(biāo)識和變量或者結(jié)構(gòu)標(biāo)識和類型定義(typedef)。先定義變量,再使用。盡量避免在if的條件中進(jìn)行賦值。請在名字中使用下劃線以分割單詞,盡量使用小寫;把大寫字母留給宏和枚舉常量,以及根據(jù)統(tǒng)一慣例使用的前綴。例如,應(yīng)該使用類似ignore_space_change_flag的名字;不要使用類似iCantReadThis的名字。用于表明一個命令行選項(xiàng)是否給出的變量應(yīng)該在選項(xiàng)含義的說明之后,而不是選項(xiàng)字符之后被命名。Linux內(nèi)核編程風(fēng)格Linux內(nèi)核縮進(jìn)風(fēng)格是8個字符。Linux內(nèi)核風(fēng)格采用K&R標(biāo)準(zhǔn),將開始的大括號放在一行的最后,而將結(jié)束的大括號放在一行的第一位。命名盡量簡潔。不應(yīng)該使用諸如ThisVariableIsATemporaryCounter之類的名字。應(yīng)該命名為tmp,這樣容易書寫,也不難理解。命名全局變量,應(yīng)該用描述性命名方式,例如應(yīng)該命名“count_active_users()”,而不是“cntusr()”。本地變量應(yīng)該避免過長。函數(shù)最好短小精悍,一般來說不要讓函數(shù)的參數(shù)多于10個,否則應(yīng)該嘗試分解這個過于復(fù)雜的函數(shù)。通常情況,注釋說明代碼的功能,而不是其實(shí)現(xiàn)原理。避免把注釋插到函數(shù)體內(nèi),而寫到函數(shù)前面,說明其功能,如果這個函數(shù)的確很復(fù)雜,其中需要有部分注釋,可以寫些簡短的注釋來說明那些重要的部分,但是不能過多。文本編輯器vivi的模式vi的進(jìn)入命令模式插入模式末行模式vi的模式CommandMode(命令模式)這是執(zhí)行vi后的缺省模式此時鍵盤輸入當(dāng)作命令命令有大小寫之區(qū)分InputMode(插入模式)使用a、i、o、c、r、s
進(jìn)入插入模式用戶輸入的任何字符都被vi當(dāng)做文件內(nèi)容保存起來,并將其顯示在屏幕上按下ESC鍵即可回到CommandModevi的模式LastMode(末行模式)在CommandLine按下:即即可可進(jìn)入該該模式式用來進(jìn)行行保存存文件件、打開文文檔或環(huán)境的設(shè)定命令有有大小小寫之分vi的的進(jìn)入入和內(nèi)內(nèi)容輸輸入進(jìn)入::vi文文件名名輸入文文件內(nèi)內(nèi)容((進(jìn)進(jìn)入插插入模模式))新增(append)a從從光光標(biāo)所所在位位置后后面開開始新新增內(nèi)內(nèi)容A從從光標(biāo)標(biāo)所在在行最最后面面的地地方開開始新新增內(nèi)內(nèi)容。。插入(insert)i從從光光標(biāo)所所在位位置前前面開開始插插入內(nèi)內(nèi)容I從從光標(biāo)標(biāo)所在在行的的第一一個非非空白白字符符前面面開始始插入入資料料。開始(open)o在在光光標(biāo)所所在行行下新新增一一行并并進(jìn)入入輸入入模式式。O在在光標(biāo)標(biāo)所在在行上上新增增一行行并進(jìn)進(jìn)入輸輸入模模式。。(命令令模式式)命令模模式1、光光標(biāo)的的移動動h左左移一一個字字符l右右移一一個字字符j下下移一一行k上上移一一行w,W跳跳至后后一個個字的的開頭頭(W忽略略標(biāo)點(diǎn)點(diǎn))b,B跳跳至至前一一個字字的開開頭((B忽忽略標(biāo)標(biāo)點(diǎn)))e移移動到到后一一個字字的末末尾^至至本行行第一一個非非空字字符$至至行尾尾0至至行首首H移移動到到當(dāng)前前窗口口的第第一列列M移移動動到當(dāng)當(dāng)前窗窗口的的中間間列L移移動到到視窗窗的最最后一一列)光光標(biāo)標(biāo)所在在位置置到下下個句句子的的第一一個字字母(光光標(biāo)所所在位位置到到該句句子的的第一一個字字母}光光標(biāo)標(biāo)所在在位置置到該該段落落的最最后一一個字字母{光光標(biāo)標(biāo)所在在位置置到該該段落落的第第一個個字母母命令模模式1、光光標(biāo)的的移動動(續(xù)續(xù))nH將將光標(biāo)標(biāo)移到到屏幕幕的第第n行行nL將將光標(biāo)標(biāo)移到到屏幕幕的倒倒數(shù)第第n行行CTRL-d向向下下半頁頁CTRL-f向向下下一頁頁CTRL-u向向上上半頁頁CTRL-b向向上上一頁頁n-減減號移移動到到上一一行的的第一一個非非空白白字符符,前前面加加上數(shù)數(shù)字可可以指指定移移動到到以上上n行行n+加加號號移動動到下下一行行的第第一個個非空空白字字符,,前面面加上上數(shù)字字可以以指定定移動動到以以下n行行命令模模式2、刪刪除x刪刪除除光標(biāo)標(biāo)所在在字符符X刪刪除光光標(biāo)前前面的的字符符s刪刪除光光標(biāo)所所在字字符,,并進(jìn)進(jìn)入輸輸入模模式S刪刪除除光標(biāo)標(biāo)所在在的行行,并并進(jìn)入入輸入入模式式dd刪刪除除光標(biāo)標(biāo)所在在的行行D從從光光標(biāo)位位置開開始刪刪除到到行尾尾d與光光標(biāo)移移動命命令的的組合合命令模模式3、修修改r修修改改光標(biāo)標(biāo)所在在字符符,r后后接著著要修修改的的字符符。如如,rc可可以以用字字符““c””替換換光標(biāo)標(biāo)所指指向的的當(dāng)前前字符符R進(jìn)進(jìn)入入替換換狀態(tài)態(tài),新新增內(nèi)內(nèi)容會會覆蓋蓋原先先內(nèi)容容,直直到按按[ESC]回回到命命令模模式下下為止止cc修修改光光標(biāo)所所在行行C修修改從從光標(biāo)標(biāo)位置置到該該行末末尾的的內(nèi)容容c與與光標(biāo)標(biāo)移動動命令令的組組合命令模模式4、復(fù)復(fù)制和和移動動yy復(fù)復(fù)制當(dāng)當(dāng)前行行到內(nèi)內(nèi)存緩緩沖區(qū)區(qū)nyy復(fù)復(fù)制制n行行內(nèi)容容到內(nèi)內(nèi)存緩緩沖區(qū)區(qū)y與光光標(biāo)移移動的的組合合p將將緩沖沖區(qū)的的內(nèi)容容粘貼貼到光光標(biāo)的的后面面P將將緩沖沖區(qū)的的內(nèi)容容粘貼貼到光光標(biāo)的的前面面另:在在末行行模式式下實(shí)實(shí)現(xiàn)移移動:n1,n2mn3:把n1到n2行內(nèi)容搬到第第n3行后5、搜搜索字字符串串/pattern移移至下下一個個包含含pattern的的行?pattern移移至至上一一個包包含pattern的行行/往往下重重復(fù)查查找?往往上上重復(fù)復(fù)查找找n在在同同一方方向重重復(fù)查查找N在在相反反方向向重復(fù)復(fù)查找找/pattern/+n移移至下下一個個pattern所所在行行后的的第n行?pattern?-n移移至上上一個個Pattern所所在行行前的的第n行6、其其他u撤撤銷前前一條條命令令的結(jié)結(jié)果*.$^[]{}\/包含在在查找找字符符串中中,要要用轉(zhuǎn)轉(zhuǎn)義字字符(\)命令模模式末行模模式1、文文件的的保存存和退退出:w保存:q退出:w!強(qiáng)制保保存:q!強(qiáng)制退退出:wq保存退退出:wq!強(qiáng)制保保存退退出末行模模式2、字字符串串的替替換:s/str1/str2/用用字字符串串str2替替換換行中中首次次出現(xiàn)現(xiàn)的字字符串串str1:s/str1/str2/g用用字符符串str2替替換行行中所所有出出現(xiàn)的的字符符串str1:.,$s/str1/str2/g用用字符符串str2替替換正正文當(dāng)當(dāng)前行行到末末尾所所有出出現(xiàn)的的字符符串str1:1,$s/str1/str2/g用用字符符串str2替替換正正文中中所有有出現(xiàn)現(xiàn)的字字符串串str1:g/str1/s//str2/g功功能同同上末行模模式其他:::n將將光標(biāo)標(biāo)移到到第n行行編輯多多個文文件vifile1file2……:n編編輯下下一個個文件件:efilename編編輯指指定文文件Linux下函函數(shù)庫庫(1/3)一個““程序序函數(shù)數(shù)庫””就是是一個個文件件包含含了一一些編編譯好好的代代碼和和數(shù)據(jù)據(jù),這這些編編譯好好的代代碼和和數(shù)據(jù)據(jù)可以以在事事后供供其他他的程程序使使用。。程序序函數(shù)數(shù)庫可可以使使整個個程序序更加加模塊塊化,,更容容易重重新編編譯,,而且且更方方便升升級。??煞址譃閮蓛煞N類類型::靜態(tài)函函數(shù)庫庫(staticlibraries):是是一個個普通通的目目標(biāo)文文件的的集合合,一一般用用“.a””作為為文件件的后后綴。。靜態(tài)態(tài)函數(shù)數(shù)庫和和共享享函數(shù)數(shù)庫相相比有有很多多的缺缺點(diǎn),,占用用內(nèi)存存空間間多。。但使使用ELF格式式的靜靜態(tài)庫庫函數(shù)數(shù)生成成的代代碼可可以比比使用用共享享函數(shù)數(shù)庫的的程序序運(yùn)行行速度度上快快一些些??梢杂糜胊r這個個程序序來創(chuàng)創(chuàng)建一一個靜靜態(tài)函函數(shù)庫庫文件件,或或者往往一個個已經(jīng)經(jīng)存在在地靜靜態(tài)函函數(shù)庫庫文件件添加加新的的目標(biāo)標(biāo)代碼碼。例如,把把file1.o和和file2.o加加入到到my_library.a這個個函數(shù)數(shù)庫文文件::arrcsmy_library.afile1.ofile2.o然后運(yùn)運(yùn)行ranlib,以以給庫庫加入入一些些索引引信息息Linux下函函數(shù)庫庫(2/3)共享函函數(shù)庫庫(sharedlibraries):當(dāng)當(dāng)一個個可執(zhí)執(zhí)行程程序在在啟動動的時時候被被加載載的函函數(shù)。。每個個共享享函數(shù)數(shù)庫都都有個個特殊殊的名名字,,稱作作“soname””。soname名名字命命名必必須以以“l(fā)ib”作作為前前綴,,然后后是函函數(shù)庫庫的名名字,,然后后是““.so””,最最后是是版本本號信信息。。優(yōu)點(diǎn)::多進(jìn)進(jìn)程使使用同同一函函數(shù)庫庫;修修改函函數(shù)庫庫不需需重新新連編編。安裝一一個新新版本本的函函數(shù)庫庫的時時候,,要先先將這這些函函數(shù)庫庫文件件拷貝貝到一一些特特定的的目錄錄中,,運(yùn)行行l(wèi)dconfig就可可以。。ldconfig檢查查已經(jīng)經(jīng)存在在的庫庫文件件,然然后創(chuàng)創(chuàng)建soname的的符號號鏈接接到真真正的的函數(shù)數(shù)庫,,同時時設(shè)置置/etc/ld.so.cache這個個緩沖沖文件件。例例如如,創(chuàng)創(chuàng)建兩兩個目目標(biāo)文文件(a.o和和b.o),然然后創(chuàng)創(chuàng)建一一個包包含a.o和b.o的共共享函函數(shù)庫庫。gcc-fPIC-g-c-Walla.cgcc-fPIC-g-c-Wallb.cgcc-shared-Wl,-soname,liblusterstuff.so.1-oliblusterstuff.so.1.0.1a.ob.o––lc注::””-fPIC””是是位位置置無無關(guān)關(guān)參參數(shù)數(shù),,””-g””和和““--Wall””參參數(shù)數(shù)不不是是必必須須的的。。Linux下下函函數(shù)數(shù)庫庫((3/3))函數(shù)數(shù)庫庫和和頭頭文文件件的的保保存存位位置置a.函函數(shù)數(shù)庫庫/lib::系系統(tǒng)統(tǒng)必必備備共共享享函函數(shù)數(shù)庫庫/usr/lib::標(biāo)標(biāo)準(zhǔn)準(zhǔn)共共享享函函數(shù)數(shù)庫庫和和靜靜態(tài)態(tài)函函數(shù)數(shù)庫庫/usr/i486-linux-libc5/lib::libc5兼兼容容性性函函數(shù)數(shù)庫庫/usr/X11R6/lib::X11R6的的函函數(shù)數(shù)庫庫/usr/local/lib::本本地地函函數(shù)數(shù)庫庫b.頭頭文文件件/usr/include::系系統(tǒng)統(tǒng)頭頭文文件件/usr/local/include::本本地地頭頭文文件件c.共共享享函函數(shù)數(shù)庫庫的的相相關(guān)關(guān)配配置置和和命命令令/etc/ld.so.conf::包包含含共共享享庫庫的的搜搜索索位位置置ldconfig::共共享享庫庫管管理理工工具具,,一一般般在在更更新新了了共共享享庫庫之之后后要要運(yùn)運(yùn)行行該該命命令令ldd::可可查查看看可可執(zhí)執(zhí)行行文文件件所所使使用用的的共共享享函函數(shù)數(shù)庫庫使用用GNUcc開開發(fā)發(fā)應(yīng)應(yīng)用用程程序序gcc的的簡簡介介可執(zhí)執(zhí)行行文文件件的的格格式式gcc的的使使用用gcc的的簡簡介介gcc是是GNU的的C和和C++編編譯譯器器。。實(shí)實(shí)際際上上,,gcc能能夠夠編編譯譯多種種語言言::C、、C++和和ObjectC等等。。利利用用gcc命命令令可可同同時時編編譯譯并并連連接接C和和C++源源程程序序。。也也可可以以對對幾幾個個C源源文文件件利利用用gcc編編譯譯、、連連接接并并生生成成可可執(zhí)執(zhí)行行文文件件。。gcc可可以以使使程程序序員員靈靈活活地地控控制制編編譯譯過過程程。。編編譯譯過過程程一一般般可可以以分分為為下下面面四四個個階階段段,,每每個個階階段段分分別別調(diào)調(diào)用用不不同同的的工工具具進(jìn)進(jìn)行行處處理理預(yù)處理鏈接編譯組譯源程序(*.c)可執(zhí)行文件預(yù)處理器編譯器組譯器連接器gcc的的四四個個階階段段命令令gcc首首先先調(diào)調(diào)用用cpp進(jìn)進(jìn)行行預(yù)預(yù)處處理理,,在在預(yù)預(yù)處處理理過過程程中中,,對對源源代代碼碼文文件件中中的的文文件件包包含含(include)、、預(yù)預(yù)編編譯譯語語句句(如如宏宏定定義義define等等)進(jìn)進(jìn)行行分分析析。。接著著調(diào)調(diào)用用cc1進(jìn)進(jìn)行行編編譯譯,,這這個個階階段段根根據(jù)據(jù)輸輸入入文文件件生生成成以以.o為為后后綴綴的的目目標(biāo)標(biāo)文文件件。。匯編編過過程程是是針針對對匯匯編編語語言言的的步步驟驟,,調(diào)調(diào)用用as進(jìn)進(jìn)行行工工作作,,一一般般來來講講,,.S或或.s為為后后綴綴的的匯匯編編語語言言源源代代碼碼文文件件匯匯編編之之后后都都生生成成以以.o為為后后綴綴的的目目標(biāo)標(biāo)文文件件。。當(dāng)所所有有的的目目標(biāo)標(biāo)文文件件都都生生成成之之后后,,gcc就就調(diào)調(diào)用用ld來來完完成成最最后后的的關(guān)關(guān)鍵鍵性性工工作作,,這這個個階階段段就就是是連連接接。。在在連連接接階階段段,,所所有有的的目目標(biāo)標(biāo)文文件件被被安安排排在在可可執(zhí)執(zhí)行行程程序序中中的的恰恰當(dāng)當(dāng)?shù)牡奈晃恢弥茫?,同同時時,,該該程程序序所所調(diào)調(diào)用用到到的的庫庫函函數(shù)數(shù)也也從從各各自自所所在在的的函函數(shù)數(shù)庫庫中中連連到到合合適適的的地地方方。??蓤?zhí)行文文件格式式Linux系統(tǒng)統(tǒng)中可執(zhí)執(zhí)行文件件有兩種種格式。。第一種格格式是a.out格式式,這種種格式用用于早期期的Linux系統(tǒng)以以及Unix系統(tǒng)的的原始格格式。a.out來自自于UnixC編譯譯程序默默認(rèn)的可可執(zhí)行文文件名。。當(dāng)使用用共享庫庫時,a.out格式式就會發(fā)發(fā)生問題題。把a(bǔ).out格式式調(diào)整為為共享庫庫是一種種非常復(fù)復(fù)雜的操操作。因此,一一種新的的文件格格式被引引入Unix系系統(tǒng)5的的第四版版本和Solaris系統(tǒng)中中。它被被稱為可可執(zhí)行和和連接的的格式((ELF)。這這種格式式很容易易實(shí)現(xiàn)共共享庫。。ELF格格式已經(jīng)經(jīng)被Linux系統(tǒng)作作為標(biāo)準(zhǔn)準(zhǔn)的格式式采用。。gcc編編譯程序序產(chǎn)生的的所有的的二進(jìn)制制文件都都是ELF格式式的文件件(即使使可執(zhí)行行文件的的默認(rèn)名名仍然是是a.out))。較舊舊的a.out格式的的程序仍仍然可以以運(yùn)行在在支持ELF格格式的系系統(tǒng)上。。GNUC的的使用基本語法法gcc[options][filenames]說明:在gcc后面可可以有多多個編譯譯選項(xiàng),,同時進(jìn)進(jìn)行多個個編譯操操作。很很多的gcc選選項(xiàng)包括括一個以以上的字字符。因因此你必必須為每每個選項(xiàng)項(xiàng)指定各各自的連連字符。。例如,,下面的的兩個命命令是不不同的::gcc-p-gtest1.cgcc-pgtest1.c當(dāng)你不用用任何選選項(xiàng)編譯譯一個程程序時,,GCC將會建建立(假假定編譯譯成功)一個名名為a.out的可執(zhí)執(zhí)行文件件。gcc選選項(xiàng)-o選項(xiàng)項(xiàng)你能用-o編編譯選選項(xiàng)來為為將產(chǎn)生生的可執(zhí)執(zhí)行文件件指定一一個文件件名來代代替a.out。例:gcc––ocountcount.c-c選項(xiàng)項(xiàng):告訴訴GCC僅把源源代碼編編譯為目目標(biāo)代碼碼而跳過過匯編和和連接的的步驟。。這個選選項(xiàng)使用用的非常常頻繁,,因?yàn)樗沟镁幘幾g多個個C程序序時速度度更快并并且更易易于管理理。缺省省時GCC建立立的目標(biāo)標(biāo)代碼文文件有一一個.o的擴(kuò)展展名。例:gcc––ctest2.c-E只只運(yùn)行C預(yù)預(yù)編譯器器。-S編編譯選項(xiàng)項(xiàng)告訴gcc在為為C代代碼產(chǎn)產(chǎn)生了匯匯編語言言文件后后停止編編譯。-shared生成成共享目目標(biāo)文件件。通常常用在建建立共享享庫時。。-static禁止止使用共共享連接接。警告選項(xiàng)項(xiàng)在gcc中用開開關(guān)-Wall控制警警告信息息,使用用示例命命令如下下:gcc––Wall-otest3_1test3_1.c-w不不生成任任何警告告信息。。查找選項(xiàng)項(xiàng)gcc一一般使用用默認(rèn)路路徑查找找頭文件件和庫文文件。如如果文件件所用的的頭文件件或庫文文件不在在缺省目目錄下,,則編譯譯時要指指定它們們的查找找路徑。。-I選項(xiàng)項(xiàng):指定定頭文件件的搜索索目錄例:gcc––I/export/home/st––otest1test1.c-L選項(xiàng)項(xiàng):指定定庫文件件的搜索索目錄例:gcc––L/usr/X11/R6/lib––otest1test1.c多個源文文件生成成一個可可執(zhí)行文文件問題:有有多個源源文件時時,如何何生成一一個可執(zhí)執(zhí)行文件件?方法1::gcc–Wall–omytesttest1.ctest2.ctest3.c方法2::gcc-Wall-ctest1.cgcc-Wall––ctest2.cgcc-Wall––ctest3.cgcc––omytesttest1.otest2.otest3.o優(yōu)化選項(xiàng)項(xiàng)優(yōu)化選項(xiàng)項(xiàng)可以使使GCC在耗費(fèi)費(fèi)更多編編譯時間間和犧牲牲易調(diào)試試性的基基礎(chǔ)上產(chǎn)產(chǎn)生更小小更快的的可執(zhí)行行文件。。這些選選項(xiàng)中最最典型的的是-O和-O2選項(xiàng)項(xiàng)。-O0不不進(jìn)行行優(yōu)化處處理。-O選項(xiàng)項(xiàng):告訴訴GCC對源代代碼進(jìn)行行基本優(yōu)優(yōu)化。這這些優(yōu)化化在大多多數(shù)情況況下都會會使程序序執(zhí)行的的更快。。-O2選選項(xiàng):告告訴GCC產(chǎn)產(chǎn)生盡可可能小和和盡可能能快的代代碼。-O2選選項(xiàng)將使使編譯的的速度比比使用-O時慢慢。但通通常產(chǎn)生生的代碼碼執(zhí)行速速度會更更快。-O3選選項(xiàng):比比-O2更更進(jìn)一步步優(yōu)化,,包括inline函數(shù)數(shù)。版本選項(xiàng)項(xiàng)-v選項(xiàng)項(xiàng)用戶將會會得到自自己目前前正在使使用的gcc的的版本及及與版本本相關(guān)的的一些信信息。gcc-v將將得到到如下結(jié)結(jié)果:Readingspecsfrom/usr/lib/gcc-lib/i486-box-linux/2.7.2/specsgccversion2.7.2-V選選項(xiàng)如果安裝裝了多個個版本的的gcc,并且且想強(qiáng)制制執(zhí)行其其中的某某個版本本,可以以用命令令通知系系統(tǒng)用戶戶要使用用的版本本。gcc-V2.6.3-v宏定義選選項(xiàng)-DMACRO以以字符串串“1””定義MACRO宏宏。-DMACRO=DEFN以字字符串““DEFN”定定義MACRO宏宏。-UMACRO取取消對MACRO宏宏的定定義。調(diào)試和剖剖析選項(xiàng)項(xiàng)使用調(diào)試試選項(xiàng)后后,gcc在進(jìn)進(jìn)行編譯譯的時候候,在目目標(biāo)文件件(.o)和創(chuàng)創(chuàng)建的可可執(zhí)行文文件中插插入額外外信息,,這些額額外信息息使gdb能夠夠判斷編編譯過的的代碼和和源代碼碼之間的的關(guān)系。。-g選項(xiàng)項(xiàng):告訴訴GCC產(chǎn)生能能被GNU調(diào)調(diào)試器器使用的的調(diào)試信信息以便便調(diào)試你你的程序序。例:gcc––g––otest3test3.c-pg選選項(xiàng):告告訴GCC在你你的程序序里加入入額外的的代碼,,執(zhí)行時時,產(chǎn)生生gprof用用的剖析析信息以以顯示你你的程序序的耗時時情況。。使用gdb調(diào)試試工具,,命令行行如下::例:gcc––ggdb3––otest3test3.c調(diào)試工具具gdbGDB調(diào)調(diào)試器簡簡介gdb的的常用用命令gdb應(yīng)應(yīng)用實(shí)例例gdb簡簡介Linux系統(tǒng)統(tǒng)中包含含了GNU調(diào)調(diào)試程序序gdb,它是是一個用用來調(diào)試試C和C++程序序的調(diào)試試器。可可以使程程序開發(fā)發(fā)者在程程序運(yùn)行行時觀察察程序的的內(nèi)部結(jié)結(jié)構(gòu)和內(nèi)內(nèi)存的使使用情況況。gdb所所提供供的一些些功能如如下所示示:運(yùn)行程序序,設(shè)置置所有的的能影響響程序運(yùn)運(yùn)行的參參數(shù)和環(huán)環(huán)境;控制程序序在指定定的條件件下停止止運(yùn)行;;當(dāng)程序停停止時,,可以檢檢查程序序的狀態(tài)態(tài);修改程序序的錯誤誤,并重重新運(yùn)行行程序;;動態(tài)監(jiān)視視程序中中變量的的值;可以單步步逐行執(zhí)執(zhí)行代碼碼,觀察察程序的的運(yùn)行狀狀態(tài)。分析崩潰潰程序的的產(chǎn)生的的core文件件gdb的的特點(diǎn)gdb的的功能非非常強(qiáng)大大到目前為為止,gdb已已能夠支支持Moduls-2、Chill、Pascal和FORTRAN程序的的調(diào)試,,但是調(diào)調(diào)試這些些語言的的源程序序時有一一些功能能還不能能使用。。例如調(diào)試試FORTRAN程序序時還不不支持表表達(dá)式的的輸入、、輸出變變量或類類FORTRAN的詞詞法。gdb程程序調(diào)試試的對象象是可執(zhí)執(zhí)行文件件,而不不是程序序的源代代碼文件件。然而,并并不是所所有的可可執(zhí)行文文件都可可以用gdb調(diào)調(diào)試。如如果要讓讓產(chǎn)生的的可執(zhí)行行文件可可以用來來調(diào)試,,需在執(zhí)執(zhí)行g(shù)cc指令令編譯程程序時,,加上-g參數(shù)數(shù),指定定程序在在編譯時時包含調(diào)調(diào)試信息息。調(diào)試信息息包含程程序里的的每個變變量的類類型和在在可執(zhí)行行文件里里的地址址映射以以及源代代碼的行行號。gdb利利用這這些信息息使源代代碼和機(jī)機(jī)器碼相相關(guān)聯(lián)。。gdb是一一個用來來調(diào)試C和C++程序序的常用用調(diào)試工工具之一一。gdb的啟啟動在命令行上上輸入gdb并按回回車鍵就可可以運(yùn)行g(shù)db了,,如果一切切正常的話話,將啟動動gdbgdb[filename]出現(xiàn)(gdb)在這里,可可以輸入調(diào)調(diào)試命令在可以使用用gdb調(diào)試程程序之前,,必須使用用-g選選項(xiàng)編譯譯源文件。。可在makefile中中如下定定義CFLAGS變量::CFLAGS=-g運(yùn)行獲取幫助信信息啟動gdb后,可以以在命令行行上指定很很多的選項(xiàng)項(xiàng)。輸入::help可以獲得gdb的幫幫助信息。。如果想要了了解某個具具體命令((比如break))的幫助信信息,在gdb提示示符下輸入入下面的命命令:break屏幕上會顯顯示關(guān)于break的幫助信信息。從返返回的信息息可知,break是用于設(shè)設(shè)置斷點(diǎn)的的命令。另一個獲得得gdb幫幫助的方法法是瀏覽gdb的手手冊頁。在在LinuxShell提提示符輸入入:mangdb可以看到man的手手冊頁gdb命令令的分類在gdb提示示符處鍵入入help,將列出出命令的分分類,主要要的分類有有:aliases:命命令別名breakpoints:斷斷點(diǎn)定義;;data::數(shù)據(jù)查看看;files:指定并并查看文件件;internals:維護(hù)命命令;running:程程序執(zhí)行;;stack:調(diào)用棧棧查看;statu:狀態(tài)查查看;tracepoints:跟跟蹤程序執(zhí)執(zhí)行。后跟命令的的分類名,,可獲得該該類命令的的詳細(xì)清單單基本gdb命令(1/2)file命命令:裝入入想要調(diào)試試的可執(zhí)行行文件。cd命令::改變工作作目錄。pwd命令令:返回當(dāng)當(dāng)前工作目目錄。run命令令:執(zhí)行當(dāng)當(dāng)前被調(diào)試試的程序。。kill命命令:停止止正在調(diào)試試的應(yīng)用程程序。list命命令:列出出正在調(diào)試試的應(yīng)用程程序的源代代碼。break命令:設(shè)設(shè)置斷點(diǎn)。。watch命令:設(shè)設(shè)置監(jiān)視點(diǎn)點(diǎn),監(jiān)視表表達(dá)式的變變化。awatch命令::設(shè)置讀寫寫監(jiān)視點(diǎn)。。當(dāng)要監(jiān)視視的表達(dá)式式被讀或?qū)憣憰r將應(yīng)用用程序掛起起。它的語語法與watch命命令相同。。rwatch命令::設(shè)置讀監(jiān)監(jiān)視點(diǎn),當(dāng)當(dāng)監(jiān)視表達(dá)達(dá)式被讀時時將程序掛掛起,等侍侍調(diào)試。此此命令的語語法與watch相相同。next命命令:執(zhí)行行下一條源源代碼,但但是不進(jìn)入入函數(shù)內(nèi)部部。也就是是說,將一一條函數(shù)調(diào)調(diào)用作為一一條語句執(zhí)執(zhí)行。執(zhí)行行這個命令令的前提是是已經(jīng)run,開始始了代碼的的執(zhí)行?;緂db命令(2/2)step命命令:執(zhí)行行下一條源源代碼,進(jìn)進(jìn)入函數(shù)內(nèi)內(nèi)部。如果果調(diào)用了某某個函數(shù),,會跳到函函數(shù)所在的的代碼中等等候一步步步執(zhí)行。執(zhí)執(zhí)行這個命命令的前提提是已經(jīng)用用run開開始執(zhí)行代代碼。display命令令:在應(yīng)用用程序每次次停止運(yùn)行行時顯示表表達(dá)式的值值。infobreak命令::顯示當(dāng)前前斷點(diǎn)列表表,包括每每個斷點(diǎn)到到達(dá)的次數(shù)數(shù)16)infofiles命令:顯顯示調(diào)試文文件的信息息。17)infofunc命命令:顯示示所有的函函數(shù)名。18)infolocal命令:顯顯示當(dāng)前函函數(shù)的所有有局部變量量的信息。。19)infoprog命命令:顯示示調(diào)試程序序的執(zhí)行狀狀態(tài)。20)print命命令;顯示示表達(dá)式的的值。21)delete命令:刪刪除斷點(diǎn)。。指定一個個斷點(diǎn)號碼碼,則刪除除指定斷點(diǎn)點(diǎn)。不指定定參數(shù)則刪刪除所有的的斷點(diǎn)。22)Shell命命令:執(zhí)行行LinuxShell命命令。23)make命令令:不退出出gdb而而重新編譯譯生成可執(zhí)執(zhí)行文件。。24)Quit命令令:退出gdb。gdb使使用實(shí)例((1/2))/*一個個有錯誤的的C源源程序*/#include<stdio.h>#include<stdlib.h>staticcharbuff[256];staticchar*string;intmain(){printf("Pleaseinputastring:");gets(string);printf("\nYourstringis:%s\n",string);}上面這個程程序非常簡簡單,其目目的是接受受用戶的輸輸入,然后后將用戶的的輸入打印印出來。該該程序使用用了一個個未經(jīng)過初初始化的字字符串地址址string,,因此,編編譯并運(yùn)行行之后,將將出現(xiàn)SegmentFault錯誤::$gcc-otest-gtest.c$./testPleaseinputastring:asfdSegmentationfault(coredumped)gdb使使用實(shí)例((2/2))為了查找該該程序中出出現(xiàn)的問題題,我們利利用gdb,并按按如下的步步驟進(jìn)行::1.運(yùn)行g(shù)dbbugging命命令,裝裝入bugging可執(zhí)執(zhí)行文件;;2.執(zhí)行裝裝入的bugging命命令;3.使用where命令令查看程序序出錯的地地方;4.利用list命令查查看調(diào)用gets函數(shù)附附近的代碼碼;5.唯一能能夠?qū)е耮ets函數(shù)出出錯的因素素就是變量量string。。用print命命令查看看string的的值;6.在gdb中中,我們可可以直接修修改變量的的值,只要要將string取一個個合法的指指針值就可可以了,為為此,我我們在第11行行處設(shè)置斷斷點(diǎn);7.程序重重新運(yùn)行到到第11行處停停止,這時時,我們可可以用setvariable命命令修改改string的的取值;;8.然后繼繼續(xù)運(yùn)行,,將看到正正確的程序序運(yùn)行結(jié)果果。GNUmake和和makefileGNUmake概概述Makefile的的基本結(jié)結(jié)構(gòu)Makefile中中的變量GNUmake的的主要預(yù)預(yù)定義變量量Makefile的的隱含規(guī)則則make命命令行選項(xiàng)項(xiàng)使用automake和autoconf產(chǎn)生生MakefileGNUmake概概述在大型的開開發(fā)項(xiàng)目中中,人們通通常利用make工具來來自動完成成編譯工作作。這些工工作包括::如果僅修改改了某幾個個源文件,,則只重新新編譯這幾幾個源文件件;如果某個頭頭文件被修修改了,則則重新編譯譯所有包含含該頭文件件的源文件件。利用這種自自動編譯可可大大簡化化開發(fā)工作作,避免不不必要的重重新編譯。。實(shí)際上,make工工具通過過一個稱為為makefile的文文件來完成成并自動維維護(hù)編譯工工作。makefile需需要按照某某種語法進(jìn)進(jìn)行編寫,,其中說明明了如何編編譯各個源源文件并連連接生成可可執(zhí)行文件件,并定義義了源文件件之間的依依賴關(guān)系。。當(dāng)修改改了其中某某個源文件件時,如果果其他源文文件依賴于于該文件,,則也要重重新編譯所所有依賴該該文件的源源文件。默認(rèn)情況下下,GNUmake工具具在當(dāng)前工工作目錄按按如下順序序搜索makefile::GNUmakefilemakefileMakefilemakefile舉舉例在UNIX中,習(xí)慣慣使用makefile作作為makfile文件件。Linux程序員使使用第三種種文件名Makefile。。因?yàn)榈谝灰粋€字母是是大寫,通通常被列在在一個目錄錄的文件列列表的最前前面。如果要使用用其他文件件作為makefile,,則可利用用類似下下面的make命命令選項(xiàng)項(xiàng)指定makefile文文件:$make-fMakefile.debug例1:一個個簡單的makefileprog:prog1.oprog2.ogccprog1.oprog2.o-oprog
prog1.o:prog1.clib.hgcc-c-I.-oprog1.oprog1.cprog2.o:prog2.cgcc-cprog2.cMakefile的的基本結(jié)結(jié)構(gòu)(1/2)Makefile是是一個文本本形式的數(shù)數(shù)據(jù)庫文件件,其中包包含一些規(guī)規(guī)則來告訴訴make處理哪些些文件以及及如何處理理這些文件件。規(guī)則主要是是描述哪些些文件(稱稱為target目目標(biāo)文件,,不要和編編譯時產(chǎn)生生的目標(biāo)文文件相混淆淆)是從哪哪些別的文文件(稱為為dependency依賴賴文件)中中產(chǎn)生的,,以及用什什么命令((command))來執(zhí)行這這個過程。。依靠這些信信息,make會對對磁盤上的的文件進(jìn)行行檢查,如如果目標(biāo)文文件的生成成或被改動動時的時間間(稱為該該文件時間間戳)至少少比它的一一個依賴文文件還舊的的話,make就執(zhí)執(zhí)行相應(yīng)的的命令,以以更新目標(biāo)標(biāo)文件。目標(biāo)文件不不一定是最最后的可執(zhí)執(zhí)行文件,,可以是任任何一個中中間文件并并可以作為為其他目標(biāo)標(biāo)文件的依依賴文件。。Makefile的的基本結(jié)結(jié)構(gòu)(2/2)Makefile規(guī)規(guī)則的一般般形式如下下:target:dependencydependency(tab)<command>一個Makefile文文件主要含有有一系列的規(guī)規(guī)則,每條規(guī)規(guī)則包含以下下內(nèi)容。一個目標(biāo)(target),即make最終需需要創(chuàng)建的文文件,如可執(zhí)執(zhí)行文件和目目標(biāo)文件;目目標(biāo)也可以是是要執(zhí)行的動動作,如“clean””。一個或多個依依賴文件(dependency))列表,通常常是編譯目標(biāo)標(biāo)文件所需要要的其他文件件。一系列命今(command),是是make執(zhí)執(zhí)行的動作,,通常是把指指定的相關(guān)文文件編譯成目目標(biāo)文件的編編譯命令,每每個命令占一一行,且每個個命令行的起起始字符必須須為TAB字字符。除非特別指定定,否則make的工作作目錄就是當(dāng)當(dāng)前目錄。target是需要創(chuàng)建建的二進(jìn)制文文件或目標(biāo)文文件,dependency是在創(chuàng)創(chuàng)建target時需要要用到的一個個或多個文件件的列表,命命令序列是創(chuàng)創(chuàng)建target文件所所需要執(zhí)行的的步驟,比如如編譯命令。。Makefile實(shí)例((1/3)#以#開頭頭的為注釋行行test:prog.ocode.ogcc–otestprog.ocode.oprog.o:prog.cprog.hcode.hgcc–cprog.c–oprog.ocode.o:code.ccode.hgcc–ccode.c–ocode.oclean::rm–f*.o上面的Makefile文件中共定定義了四個目目標(biāo):test、prog.o、code.o和clean。目標(biāo)從每行的的最左邊開始始寫,后面跟跟一個冒號((:),如果果有與這個目目標(biāo)有依賴性性的其他目標(biāo)標(biāo)或文件,把把它們列在冒冒號后面,并并以空格隔開開。然后另起起一行開始寫寫實(shí)現(xiàn)這個目目標(biāo)的一組命命令。在Makefile中,,可使用續(xù)行行號(\)將將一個單獨(dú)的的命令行延續(xù)續(xù)成幾行。但但要注意在續(xù)續(xù)行號(\))后面不能跟跟任何字符((包括空格和和鍵)Makefile實(shí)例((2/3)一般情況下,,調(diào)用make命令可輸輸入:#maketargettarget是Makefile文文件中定義的的目標(biāo)之一,,如果省略target,make就將生成Makefile文件中中定義的第一一個目標(biāo)。對于上面Makefile的例子,,單獨(dú)的一個個“make”命令等價價于:#maketest因?yàn)閠est是Makefile文文件中定義的的第一個目標(biāo)標(biāo),make首先將其讀讀入,然后從從第一行開始始執(zhí)行,把第第一個目標(biāo)test作為為它的最終目目標(biāo),所有后后面的目標(biāo)的的更新都會影影響到test的更新。。第一條規(guī)則說說明只要文件件test的的時間戳比文文件prog.o或code.o中中的任何一個個舊,下一行行的編譯命令令將會被執(zhí)行行。Makefile實(shí)例((3/3)但是,在檢查查文件prog.o和code.o的時間戳之之前,make會在下面面的行中尋找找以prog.o和code.o為為目標(biāo)的規(guī)則則,在第三行行中找到了關(guān)關(guān)于prog.o的規(guī)則則,該文件的的依賴文件是是prog.c、prog.h和code.h。同樣,make會在在后面的規(guī)則則行中繼續(xù)查查找這些依賴賴文件的規(guī)則則,如果找不不到,則開始始檢查這些依依賴文件的時時間戳,如果果這些文件中中任何一個的的時間戳比prog.o的新,make將執(zhí)行行“gcc––cprog.c––oprog.o””命令,更新新prog.o文件。以同樣的方法法,接下來對對文件code.o做類類似的檢查,,依賴文件是是code.c和code.h。當(dāng)當(dāng)make執(zhí)執(zhí)行完所有這這些套嵌的規(guī)規(guī)則后,make將處理理最頂層的test規(guī)則則。如果關(guān)于于prog.o和code.o的兩兩個規(guī)則中的的任何一個被被執(zhí)行,至少少其中一個.o目標(biāo)文件件就會比test新,那那么就要執(zhí)行行test規(guī)規(guī)則中的命令令,因此make去執(zhí)行行g(shù)cc命令令將prog.o和code.o連連接成目標(biāo)文文件test。在上面Makefile的例子中,,還定義了一一個目標(biāo)clean,它它是Makefile中中常用的一種種專用目標(biāo),,即刪除所有有的目標(biāo)模塊塊make的工工作過程現(xiàn)在來看一下下make做做的工作:首先make按順序讀取取makefile中的的規(guī)則,然后檢查該規(guī)規(guī)則中的依賴賴文件與目標(biāo)標(biāo)文件的時間間戳哪個更新新如果目標(biāo)文件件的時問戳比比依賴文件還還早,就按規(guī)規(guī)則中定義的的命令更新目目標(biāo)文件。如果該規(guī)則中中的依賴文件件又是其他規(guī)規(guī)則中的目標(biāo)標(biāo)文件,那么么依照規(guī)則鏈鏈不斷執(zhí)行這這個過程,直直到Makefile文文件的結(jié)束,,至少可以找找到一個不是是規(guī)則生成的的最終依賴文文件,獲得此此文件的時間間戳然后從下到上上依照規(guī)則鏈鏈執(zhí)行目標(biāo)文文件的時間戳戳比此文件時時間戳舊的規(guī)規(guī)則,直到最最頂層的規(guī)則則通過以上的分分析過程,可可以看到make的優(yōu)點(diǎn)點(diǎn),因?yàn)?o目標(biāo)文件依依賴.c源文文件,源碼文文件里一個簡簡單改變都會會造成那個文文件被重新編編譯,并根據(jù)據(jù)規(guī)則鏈依次次由下到上執(zhí)執(zhí)行編譯過程程,直到最終終的可執(zhí)行文文件被重新連連接。例如,當(dāng)改變變一個頭文件件的時候,由由于所有的依依賴關(guān)系都在在Makefile里,,因此不再需需要記住依賴賴此頭文件的的所有源碼文文件,make可以自動動的重新編譯譯所有那些因因依賴這個頭頭文件而改變變了的源碼文文件,如果需需要,再進(jìn)行行重新連接Makefile中的變變量Makefile里的變變量就像一個個環(huán)境變量。。事實(shí)上,環(huán)環(huán)境變量在make中也也被解釋成make的變變量。這些變變量對大小寫寫敏感,一般般使用大寫宇宇母。幾乎可可以從任何地地方引用定義義的變量,變變量的主要作作用如下:保存文件名列列表。在前面面的例子里,,作為依賴文文件的一些目目標(biāo)文件名出出現(xiàn)在可執(zhí)行行文件的規(guī)則則中,而在這這個規(guī)則的命命令行里同樣樣包含這些文文件并傳遞給給gcc做為為命令參數(shù)。。如果使用一一個變量來保保存所有的目目標(biāo)文件名,,則可以方便便地加入新的的目標(biāo)文件而而且不易出錯錯。保存可執(zhí)行命命令名,如編編譯器。在不不同的Linux系統(tǒng)中中存在著很多多相似的編譯譯器系統(tǒng),這這些系統(tǒng)在某某些地方會有有細(xì)微的差別別,如果項(xiàng)目目被用在一個個非gcc的的系統(tǒng)里,則則必須將所有有出現(xiàn)編譯器器名的地方改改成用新的編編譯器名。但但是如果使用用一個變量來來代替編譯器器名,那么只只需要改變該該變量的值。。其他所有地地方的命令名名就都改變了了。保存編譯器的的參數(shù)。在很很多源代碼編編譯時,gcc需要很長長的參數(shù)選項(xiàng)項(xiàng),在很多情情況下,所有有的編譯命令令使用一組相相同的選項(xiàng),,如果把這組組選項(xiàng)使用一一個變量代表表,那么可以以把這個變量量放在所有引引用編譯器的的地方。當(dāng)要要改變選項(xiàng)的的時候,只需需改變一次這這個變量的內(nèi)內(nèi)容即可。變量的定義和和使用Makefile中的變變量是用一個個文本串在Makefile中定義義的,這個文文本串就是變變量的值。只只要在一行的的開始寫下這這個變量的名名字,后面跟跟一個“=””號,以及要要設(shè)定這個變變量的值即可可定義變量,,下面是定義義變量的語法法:VARNAME=string使用時,把變變量用括號括括起來,并在在前面加上$符號,就可可以引用變量量的值:${VARNAME}make解釋釋規(guī)則時,VARNAME在等式右右端展開為定定義它的字符符串。變量一般都在在Makefile的頭頭部定義。按按照慣例,所所有的Makefile變量都應(yīng)該該是大寫。如如果變量的值值發(fā)生變化,,就只需要在在一個地方修修改,從而簡簡化了Makefile的維護(hù)。Makefile變量舉舉例現(xiàn)在利用變量量把前面的Makefile重寫一一遍:OBJS=prog.ocode.oCC=gcctest:${OBJS}${CC}–otest${OBJS}prog.o:prog.cprog.hcode.h${CC}–cprog.c–oprog.ocode.o:code.ccode.h${CC}–ccode.c–ocode.oclean::rm–f*.o變量的類型除用戶自定義義的變量外,,make還還允許使用環(huán)境變量使用環(huán)境變量量的方法很簡簡單,在make啟動時時,make讀取系統(tǒng)當(dāng)當(dāng)前已定義的的環(huán)境變量,,并且創(chuàng)建與與之同名同值值的變量,因因此用戶可以以像在shell中一樣樣在Makefile中中方便的引用用環(huán)境變量。。需要注意的是是,如果用戶戶在Makefile中中定義了同名名的變量,用用戶自定義變變量將覆蓋同同名的環(huán)境變變量自動變量預(yù)定義變量GNUmake的主主要預(yù)定義變變量(1/2)$*不不包含含擴(kuò)展名的目目標(biāo)文件名稱稱。$+所所有有的依賴文件件,以空格分分開,并以出出現(xiàn)的先后為為序,可能包包含重復(fù)的依依賴文件。$<第第一一個依賴文件件的名稱。$?所所有有的依賴文件件,以空格分分開,這些依依賴文件的修修改日期比目目標(biāo)的創(chuàng)建日日期晚。$@目目標(biāo)的完完整名稱。$^所所有有的依賴文件件,以空格分分開,不包含含重復(fù)的依賴賴文件。$%如如果目目標(biāo)是歸檔成成員,則該變變量表示目標(biāo)標(biāo)的歸檔成員員名稱。例如如,如果目標(biāo)標(biāo)名稱為mytarget.so(image.o),則$@為mytarget.so,,而$%為為image.o。。AR歸歸檔維維護(hù)程序的名名稱,默認(rèn)值值為ar。。ARFLAGS歸歸檔維護(hù)護(hù)程序的選項(xiàng)項(xiàng)。AS匯匯編程序序的名稱,默默認(rèn)值為as。ASFLAGS匯匯編程序序的選項(xiàng)。GNUmake的主主要預(yù)定義變變量(2/2)CCC編譯譯器的名稱,,默認(rèn)值為cc。CFLAGSC編譯器器的選項(xiàng)。CPPC預(yù)預(yù)編譯器的名名稱,默認(rèn)值值為$(CC)-E。CPPFLAGSC預(yù)預(yù)編譯的選選項(xiàng)。CXXC++編譯器的的名稱,默認(rèn)認(rèn)值為g++。CXXFLAGSC++編譯器器的選項(xiàng)。FCFORTRAN編編譯器的名名稱,默認(rèn)值值為f77。FFLAGSFORTRAN編編譯器的選項(xiàng)項(xiàng)。Makefile的隱含含規(guī)則在上面的例子子中,幾個產(chǎn)產(chǎn)生目標(biāo)文件件的命令都是是從“.c””的C語言源源文件和相關(guān)關(guān)文件通過編編譯產(chǎn)生“.o”目標(biāo)文文件,這也是是一般的步驟驟。實(shí)際上,,make可可以使工作更更加自動化,,也就是說,,make知知道一些默認(rèn)認(rèn)的動作,它它有一些稱作作隱含規(guī)則的的內(nèi)置的規(guī)則則,這些規(guī)則則告訴make當(dāng)用戶沒沒有完整地給給出某些命令令的時候,應(yīng)應(yīng)該怎樣執(zhí)行行。例如,把生成成prog.o和code.o的命命令從規(guī)則中中刪除,make將會查查找隱含規(guī)則則,然后會找找到并執(zhí)行一一個適當(dāng)?shù)拿?。由于這這些命令會使使用一些變量量,因此可以以通過改變這這些變量來定定制make。象在前面面的例子中所所定義的那樣樣,make使用變量CC來定義編編譯器,并且且傳遞變量CFLAGS(編譯器參參數(shù))、CPPFLAGS(C語言言預(yù)處理器參參數(shù))、TARGET_ARCH((目標(biāo)機(jī)器的的結(jié)構(gòu)定義))給編譯器,,然后加上參參數(shù)-c,后后面跟變量$<(第一個個依賴文件名名),然后是是參數(shù)-o加加變量$@((目標(biāo)文件名名)。綜上所述,一一個C編譯的的具體命令將將會是:${CC}${CFLAGS}${CPPFLAGS}${TARGET_ARCH}–c$<-o$@隱含規(guī)則舉例例在上面的例子子中,利用隱隱含規(guī)則,可可以簡化為::OBJS=prog.ocode.oCC=gcctest:${OBJS}${CC}–o$@$^prog.o:prog.cprog.hcode.hcode.o:code.ccode.hclean:rm––f*.omake命命令行行選項(xiàng)項(xiàng)直接在在make命命令令的后后面鍵鍵入目目標(biāo)名名可建建立指指定的的目標(biāo)標(biāo),如如果直直接運(yùn)運(yùn)行make,則則建立立第一一個目目標(biāo)。。還可可以用用make-fmymakefile這這樣樣的命命令指指定make使使用特特定的的makefile,,而不不是默默認(rèn)認(rèn)的GNUmakefile、、makefile或或Makefile。。GNUmake命命令令還有有一些些其他他選項(xiàng)項(xiàng),下下面是是GNUmake命命令令的常常用命命令行行選項(xiàng)項(xiàng)命令令行選選項(xiàng)含含義::-CDIR在在讀取取makefile之之前前改變變到指指定的的目錄錄DIR。-fFILE以以指定定的FILE文文件作作為makefile。-h顯顯示所所有的的make選選項(xiàng)項(xiàng)。-i忽忽略略所有有的命命令執(zhí)執(zhí)行錯錯誤。。-IDIR當(dāng)當(dāng)包含含其他他makefile文文件件時,,可利利用該該選項(xiàng)項(xiàng)指定定搜索索目錄錄。-n只只打印印要執(zhí)執(zhí)行的的命令令,但但不執(zhí)執(zhí)行這這些命命令。。-p顯顯示make變變量數(shù)數(shù)據(jù)庫庫和隱隱含規(guī)規(guī)則。。-s在在執(zhí)行行命令令時不不顯示示命令令。-w在在處處理makefile之之前和和之后后,顯顯示工工作目目錄。。-WFILE假假定定文件件FILE已已經(jīng)經(jīng)被修修改。。使用automake和和autoconf產(chǎn)生生Makefile在開始始使用用Automake和autoconf之之前,,請先先確認(rèn)認(rèn)系統(tǒng)統(tǒng)已經(jīng)經(jīng)安裝裝以下下的軟軟件::GNUAutomakeGNUAutoconfGNUm4PerlGNULibtool(如果果你需需要產(chǎn)產(chǎn)生sharedlibrary)Automake所所產(chǎn)產(chǎn)生的的Makefile除除了了可以以做到到程序序的編編譯和和連接接,也也已經(jīng)經(jīng)把如如何產(chǎn)產(chǎn)生程程序文文件的的操作作,以以及把把安裝裝程序序都考考慮進(jìn)進(jìn)去了了,所所以源源程序序所存存放的的目錄錄架構(gòu)構(gòu)最好好符合合GNU的的標(biāo)準(zhǔn)準(zhǔn)慣例例,下下面用用hello.c來來作作為例例子進(jìn)進(jìn)行說說明。。生成一一個源源程序序在工作作目錄錄下建建立一一個新新的子子目錄錄devel,,再在在devel下下建立立一個個hello的的子目目錄,,這個個目錄錄將作作為存存放hello這這個個程序序及其其相關(guān)關(guān)文件件的地地方::用編輯輯器寫寫個hello.c文件件:#include<stdio.h>intmain(intargc,char**argv){printf("Hello,GNU!\n");return0;}使用Autoconf及及Automake來來產(chǎn)產(chǎn)生Makefile文文件的的步驟驟autoscan產(chǎn)產(chǎn)生生一個個configure.in的模模板,,執(zhí)行行autoscan后后會會產(chǎn)生生一個個configure.scan的的文件件,可可以用用它做做為configure.in文文件的的模板板:編輯configure.scan文文件,,如下下所示示,并并且把把文件件名改改成configure.in執(zhí)行aclocal和autoconf,,分分別會會產(chǎn)生生aclocal.m4及及configure兩兩個個文件件:編輯Makefile.am文件件,內(nèi)內(nèi)容如如下::執(zhí)行automake--add-missing,,Automake會會根根據(jù)Makefile.am產(chǎn)產(chǎn)生一一些文文件,,包含含最重重要的的Makefile.in::最后執(zhí)執(zhí)行./configure使用RCS/CVS來管管理源源代碼碼RCS的使使用CVS的使使用RCS的使使用RCS(RevisionControlSystem)即即程序序改版版控制制系統(tǒng)統(tǒng),主主要功功能是是用來來管理理文件件的版版本,,可以以節(jié)省省空間間和時時間。。這樣樣就不不需要要在每每個程程序開開發(fā)到到某一一個階階段就就將數(shù)數(shù)據(jù)拷拷貝到到其他他的地地方備備份起起來了了。RCS提供供了如如下幾幾個最最重要要的指指令的的:ci指指令::將文文件放放入RCS目錄錄下的的控制制系統(tǒng)統(tǒng)co指指令令::從從RCS目目錄錄下下將將文文件件取取出出rcs指指令令::用用來來對對RCS文文件件進(jìn)進(jìn)行行參參數(shù)數(shù)的的設(shè)設(shè)置置基本本操操作作方方式式一般般而而言言,,RCS所所產(chǎn)產(chǎn)生生出出來來的的文文件件會會放放在在RCS目目錄錄中中。。所所以以第第一一步步必必須須要要在在當(dāng)當(dāng)前前的的目目錄錄下下制制作作一一個個文文件件::[root@wyhlinux]#mkdirRCS接下下來來只只要要使使用用ci指指令令。。就就可可以以把把文文件件備備份份到到RCS改改版版控控制制系系統(tǒng)統(tǒng)中中::[root@wyhlinux]#citest.c若要要將將文文件件取取出出,,可可以以使使用用下下列列指指令令::[root@wyhlinux]#cotest.c取出出來來的的文文件件是是只只讀讀文文件件,,若若要要取取出出可可以以寫
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育教練全職任教合同書
- 河道景觀改造與防洪工程合同
- 萬能工生產(chǎn)管理合同
- 航空航天鍋爐替換施工合同
- 醫(yī)院廣告宣傳合同模板
- 五年級數(shù)學(xué)上冊 第七單元 可能性 ??家族e題匯編(單元測試)(含答案)(北師大版)
- 2024年河北客運(yùn)安全員考試題庫
- 年產(chǎn)800萬噸煤礦隧道工程施工組織設(shè)計
- 實(shí)踐基地教師發(fā)言稿
- 小區(qū)小院改造飯店合同模板
- 傳染病實(shí)驗(yàn)室檢查的質(zhì)量控制
- 廣東開放大學(xué)2024年秋《國家安全概論(S)(本專)》形成性考核作業(yè)參考答案
- 期中測試卷(1~3單元)(試題)2024-2025學(xué)年五年級上冊數(shù)學(xué)人教版
- 四川省成都市2024年七年級上學(xué)期期中數(shù)學(xué)試卷【附答案】
- 期中易錯密押卷(第1-5單元)(試題)-2024-2025學(xué)年五年級上冊數(shù)學(xué)人教版
- 咸寧房地產(chǎn)市場月報2024年08月
- 天然氣管道保護(hù)施工方案
- 2024-2030年中國艾草行業(yè)供需分析及發(fā)展前景研究報告
- GB/T 37342-2024國家森林城市評價指標(biāo)
- 北京市海淀區(qū)2022-2023學(xué)年七年級上學(xué)期期末語文試題
- 古詩三首《江南春》+公開課一等獎創(chuàng)新教案+教學(xué)闡釋+素材
評論
0/150
提交評論