freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

華恒的嵌入式linux入門-資料下載頁

2025-05-16 02:21本頁面
  

【正文】 $(OBJS)$(CC) $(OBJS) o executable : $(CC) $(CFLAGS) c o : $(CC) $(CFLAGS) c o 在這個(gè)makefile中引入了三個(gè)宏定義,所以如果當(dāng)這些宏中的某些值發(fā)生變化時(shí),開發(fā)者只需在要修改的宏處,將其宏值修改為要求的值即可,makefile中用到這些宏的地方會(huì)自動(dòng)變化。在make中還有一些已經(jīng)定義好的內(nèi)部變量,有幾個(gè)較常用的變量是$@, $ ,$?,$*, $^ (注意:這些變量不需要括號(hào)括住)。$@ 擴(kuò)展為當(dāng)前規(guī)則的目標(biāo)文件名;$ 擴(kuò)展為當(dāng)前規(guī)則依賴文件列表中的第一個(gè)依賴文件;$? 擴(kuò)展為所有的修改日期比當(dāng)前規(guī)則的目標(biāo)文件的創(chuàng)建日期更晚的依賴文件,該值只有在使用顯式規(guī)則時(shí)才會(huì)被使用;$* 擴(kuò)展成當(dāng)前規(guī)則中目標(biāo)文件和依賴文件共享的文件名,不含擴(kuò)展名;$^ 擴(kuò)展為整個(gè)依賴文件的列表(除掉了所有重復(fù)的文件名)。利用這些變量,可以把上面的 makefile 寫成:OBJS = CC = gccCFLAGS = Wall O gexecutable: $(OBJS)$(CC) $^ o $@ : $(CC) $(CFLAGS) –c $ o $@ : $(CC) $(CFLAGS) c $ o $@可以將宏變量應(yīng)用到其他許多地方,尤其是當(dāng)把它們和函數(shù)混合使用的時(shí)候,正確使用宏,會(huì)給開發(fā)者帶來極大的便利。隱含規(guī)則請注意,在上面的例子里,幾個(gè)產(chǎn)生 . 文件作為依賴文件產(chǎn)生 .o 目標(biāo)(obj)文件,這是一個(gè)標(biāo)準(zhǔn)的生成目標(biāo)文件的步驟。,make 會(huì)查找它的隱含規(guī)則,然后會(huì)找到一個(gè)適當(dāng)?shù)拿钊?zhí)行。實(shí)際上make已經(jīng)知道該如何生成這些目標(biāo)文件,它使用變量 CC 做為編譯器,并且傳遞宏 CFLAGS 給 C 編譯器(CXXFLAGS用于 C++ 編譯器),CPPFLAGS(C預(yù)處理選項(xiàng)), TARGET_ARCH (就目前例子而言,還不用考慮這個(gè)宏),然后它加入開關(guān)選項(xiàng) c ,后面跟預(yù)定義宏 $(第一個(gè)依賴文件名),最后是開關(guān)項(xiàng) o,后跟預(yù)定義宏$@ (目標(biāo)文件名)。一個(gè)C編譯的具體命令將 會(huì)是:$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) c $ o $@在make 工具中所包含的這些內(nèi)置的或隱含的規(guī)則,定義了如何從不同的依賴文件建立特定類型的目標(biāo)。Unix系統(tǒng)通常支持一種基于文件擴(kuò)展名即文件名后綴的隱含規(guī)則。這種后綴規(guī)則定義了如何將一個(gè)具有特定文件名后綴的文件(),轉(zhuǎn)換成為具有另一種文件名后綴的文件():系統(tǒng)中默認(rèn)的常用文件擴(kuò)展名及其含義為:.o  目標(biāo)文件  .c  C源文件  .f  FORTRAN源文件  .s  匯編源文件  .y  YaccC源語法  .l  Lex源語法而GNU make 除了支持后綴規(guī)則外還支持另一種類型的隱含規(guī)則即模式規(guī)則。這種規(guī)則更加通用,因?yàn)榭梢岳媚J揭?guī)則定義更加復(fù)雜的依賴性規(guī)則。同時(shí)可用來定義目標(biāo)和依賴文件之間的關(guān)系, 文件:  %.o : %.c   $(CC) $(CFLAGS) $(CPPFLAGS) c o $@ $偽目標(biāo)如果需要最終產(chǎn)生兩個(gè)和更多的可執(zhí)行文件,但這些文件是相互獨(dú)立的,也就是說任何一個(gè)目標(biāo)文件的重建,不會(huì)影響其他目標(biāo)文件。此時(shí),可以通過使用所謂的偽目標(biāo)來達(dá)到這一目的。一個(gè)偽目標(biāo)和一個(gè)真正的目標(biāo)文件的唯一區(qū)別在于,這個(gè)目標(biāo)文件本身并不存在。因此, make總是會(huì)假設(shè)它需要被生成,當(dāng)make把該偽目標(biāo)文件的所有依賴文件都更新后,就會(huì)執(zhí)行它的規(guī)則里的命令行。舉一個(gè)簡單的例子,如果makefile 開始處輸入all : executable1 executable2這里 executable1和executable2是最終希望生成的兩個(gè)可執(zhí)行文件。 make 把這個(gè) 39。all39。 做為它的主要目標(biāo),每次執(zhí)行時(shí)都會(huì)嘗試把 39。all39。 更新。但是,由于這行規(guī)則里并沒有命令來作用在一個(gè)叫 39。all39。 的實(shí)際文件上(事實(shí)上, all 也不會(huì)實(shí)際生成),所以這個(gè)規(guī)則并不真的改變 39。all39。 的狀態(tài)??杉热贿@個(gè)文件并不存在,所以 make 會(huì)嘗試更新 all 規(guī)則,因此就檢查它的依賴文件 executable1, exectable2 是否需要更新,如果需要,就把它們更新,從而達(dá)到生成兩個(gè)目標(biāo)文件的目的。 偽目標(biāo)在makefile中廣泛使用。函數(shù)makefile 里的函數(shù)跟它的宏很相似,在使用的時(shí)候,用一個(gè) $ 符號(hào)開始后跟圓括號(hào),在圓括號(hào)內(nèi)包含函數(shù)名,空格后跟一系列由逗號(hào)分隔的參數(shù)。例如,在 GNU Make 里有一個(gè)名為 39。wildcard39。 的函 數(shù),它只有一個(gè)參數(shù),功能是展開成一列所有符合由其參數(shù)描述的文件名,文件間以空格間隔??梢韵裣旅嫠臼褂眠@個(gè)命令:SOURCES = $(wildcard *.c)這樣會(huì)產(chǎn)生一個(gè)所有以 39。.c39。 結(jié)尾的文件的列表,然后存入變量 SOURCES 里。當(dāng)然你不需要一定要把結(jié)果存入一個(gè)變量。另一個(gè)有用的函數(shù)是 patsubst (patten substitude, 匹配替換的縮寫) 函數(shù)。它需要3個(gè)參數(shù):第一個(gè)是一個(gè)需要匹配的模式,第二個(gè)表示用什么來替換它,第三個(gè)是一個(gè)需要被處理的由空格分隔的字列。例如,處理那個(gè)經(jīng)過上面定義后的變量,OBJS = $(patsubst %.c,%.o,$(SOURCES))這個(gè)語句將處理所有在 SOURCES宏中的文件名后綴是 39。.c39。的文件 ,用 39。.o39。 把 39。.c39。 取代。注意這里的 % 符號(hào)是通配符,匹配一個(gè)或多個(gè)字符,它每次所匹配的字符串叫做一個(gè)‘柄’(stem) 。在第二個(gè)參數(shù)里,% 被解釋成用第一參數(shù)所匹配的那個(gè)柄。感興趣的讀者如果需要更進(jìn)一步的了解,請參考GNU Make 手冊。 makefile的一個(gè)具體例子在這里給讀者舉一個(gè)簡單的makefile的例子,通過對這個(gè)makefile的講解,來鞏固前面介紹的相關(guān)知識(shí)。INCLUDES =I/home/nie/mysrc/include \I/home/nie/mysrc/extern/include \I/home/nie/mysrc/src \I/home/nie/mysrc/libsrc \I. \I..EXT_CC_OPTS = DEXT_MODECPP_REQ_DEFINES = DMODEL=tune1 DRT DNUMST=2 \DTID01EQ=1 DNCSTATES=0 \DMT=0 DHAVESTDIORTM_CC_OPTS = DUSE_RTMODELCFLAGS = O gCFLAGS += $(CPP_REQ_DEFINES)CFLAGS += $(EXT_CC_OPTS)CFLAGS +=$(RTM_CC_OPTS)SRCS = \ OBJS = $(SRCS:.c=.o)RM = rm –fCC = gccLD = gccall: tune1%.o : %.c$(CC) c o $@ $(CFLAGS) $(INCLUDES) $tune1 : $(OBJS) $(LD) o $@ $(OBJS) lmclean :$(RM) $(OBJS)在這個(gè)makefile中首先定義了十個(gè)宏:39。 INCLUDES =I …39。(省略號(hào)代表I后面的內(nèi)容),39。I dirname39。 表示將dirname所指的目錄加入到程序頭文件目錄列表中去,是在進(jìn)行預(yù)處理過程中使用的參數(shù);39。 EXT_CC_OPTS = DEXT_MODE 39。 表示在程序中定義了宏EXT_MODE,等價(jià)于在源代碼寫入語句39。 define EXT_MODE 39。 ;接下來的兩個(gè)宏定義CPP_REQ_DEFINES 和RTM_CC_OPTS起到和EXT_CC_OPTS類似的作用;39。CFLAGS =O g 39。是編譯器的編譯選項(xiàng),表示在編譯的過程中對代碼進(jìn)行基本優(yōu)化,并產(chǎn)生能被GNU調(diào)試器(如gdb)使用的調(diào)試信息;39。CFLAGS += 39。 表示對這個(gè)宏定義在原來的基礎(chǔ)上增加新的內(nèi)容;39。 SRCS = …39。代表了所有要編譯的源代碼文件列表;39。 OBJS = $(SRCS:.c=.o)39。,即表示各個(gè)源文件所對應(yīng)的目標(biāo)文件名;39。 RM = rm –f 39。 表示刪除命令,f是強(qiáng)制刪除選項(xiàng),使用該符號(hào),在對文件進(jìn)行刪除時(shí),沒有提示;39。 CC = gcc 39。表示編譯器是用gcc;39。 LD= gcc39。 表示鏈接命令是用gcc;all和clean是兩個(gè)偽目標(biāo),在使用make命令的時(shí)候,如果不指明目標(biāo)文件名,則是以在makefile 中出現(xiàn)的第一個(gè)目標(biāo)作為最終目標(biāo),所以如果鍵入命令make,則偽目標(biāo)all被作為最終的目標(biāo)而執(zhí)行,由于這個(gè)文件并不存在,所以 make 會(huì)嘗試更新 all 規(guī)則,因此就檢查它的依賴文件 tune1 是否需要更新,如果需要,就把它更新,這樣偽目標(biāo)下面的兩條規(guī)則就會(huì)被執(zhí)行,從而生成可執(zhí)行文件tune1。如果要執(zhí)行刪除命令,只需要鍵入命令make clean。另外,請讀者注意在本makefile的例子中多次用到39。 \39。,該符號(hào)用于在makefile中,如果一條語句過長時(shí),可以用39。 \39。放在這條語句的右邊界,通過回車換行,使下面新一行的語句成為該語句的續(xù)行。在makefile文件中,用符號(hào)39。 39。作為注釋行語句的開始,以增強(qiáng)makefile文件的可讀性。本例假設(shè)makefile文件名為makefile,當(dāng)然也可按照個(gè)人的喜好取其他文件名,如果文件名不是makefile,Makefile的話,在用make命令是,請使用make –f makefilename。到此,希望讀者能夠掌握make 和makefile的基本使用。 使用GDB調(diào)試程序無論是多么資深的程序員在編寫的程序時(shí),都不大可能一次性就會(huì)成功,在程序運(yùn)行時(shí),會(huì)出現(xiàn)許許多多意想不到的錯(cuò)誤,一味地只是查看程序用處不大,最有效的方法通過一些手段進(jìn)入到程序內(nèi)部進(jìn)行調(diào)試。通常在調(diào)試程序的時(shí)候如果能夠得到以下一些信息,對于開發(fā)者找到錯(cuò)誤所在是很有幫助的。1. 程序是運(yùn)行到哪個(gè)語句或者表達(dá)式就發(fā)生了錯(cuò)誤?2. 如果錯(cuò)誤是在執(zhí)行一個(gè)函數(shù)的時(shí)候出現(xiàn)的,那么是程序的哪一行包含了這個(gè)函數(shù)的調(diào)用語句,在調(diào)用該函數(shù)的時(shí)候傳遞的實(shí)參是什么?3. 在程序執(zhí)行到某處時(shí),所關(guān)心的某一個(gè)變量值為多少?4.某個(gè)表達(dá)式最終運(yùn)行的結(jié)果為何值?調(diào)試器(更準(zhǔn)確地說應(yīng)該稱為符號(hào)調(diào)試器)能夠完成上述目標(biāo)。它是一個(gè)能夠運(yùn)行其他程序的應(yīng)用程序,它和普通意義上的程序的唯一不同之處在于,調(diào)試器能夠進(jìn)入到程序源碼中,允許開發(fā)者進(jìn)行逐行單步運(yùn)行,了解程序代碼執(zhí)行順序,和每條語句執(zhí)行的結(jié)果,可以在程序運(yùn)行的同時(shí),查看甚至是改變?nèi)我蛔兞恐?。在程序運(yùn)行出錯(cuò)時(shí),它為程序開發(fā)者提供程序運(yùn)行時(shí)的詳細(xì)細(xì)節(jié),從而找到出錯(cuò)的原因。在Linux系統(tǒng)中,最常用到的就是GDB(GNU Degugger)。GDB是GNU自帶的調(diào)試工具。 GDB常用命令要想使用gdb,必須在對源碼進(jìn)行編譯的時(shí)候,使用g編譯選項(xiàng)開關(guān),來通知編譯器,開發(fā)者希望進(jìn)行程序調(diào)試。用了g選項(xiàng)后,程序在編譯的時(shí)候就會(huì)包含調(diào)試信息,這些調(diào)試信息存在目標(biāo)文件中,它描述了每個(gè)函數(shù)或變量的數(shù)據(jù)類型以及源碼行號(hào)和可執(zhí)行代碼地址間對應(yīng)關(guān)系,gdb正是通過這些信息使源碼和機(jī)器碼相關(guān)聯(lián)的,它實(shí)現(xiàn)了源碼級(jí)的調(diào)試。為了使用gdb調(diào)試,只需要在命令行中輸入gdb filename(filename是用gcc編譯生成的最終可執(zhí)行文件名),該語句啟動(dòng)與調(diào)試器的文本接口。就在上一小節(jié)中所舉makefile例子來說,就是鍵入gdb tune1,則在屏幕上會(huì)出現(xiàn)[nie@uClinux mysrc]$ gdb tune1GNU gdb Red Hat Linux () (MI_OUT)Copyright 2001 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewele to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was configured as i386redhatlinux...(gdb)gdb雖然運(yùn)行起來,但是可執(zhí)行程序tune1并沒有運(yùn)行,此時(shí)在gdb提示符下直接鍵入run命令即可,如果可執(zhí)行程序在運(yùn)行的時(shí)候需要輸入命令行參數(shù),則在gdb提示符下可以這樣鍵入命令:run mandlinearguments ,就如同是輸入命令:tune1 mandlinearguments一樣,啟動(dòng)了可執(zhí)行程序的運(yùn)行。有時(shí)候,我們希望能夠斷點(diǎn)調(diào)試程序,讓程序執(zhí)行到代碼某處時(shí)停止繼續(xù)執(zhí)行下去,此時(shí)可以使用命令break,該命令的格式為break place,這里place可以是程序代碼的行號(hào),某函數(shù)名,甚至可以是用break main ,讓程序斷點(diǎn)設(shè)置在代碼一開始執(zhí)行的地方,比如對于上面舉的可執(zhí)行文件名為tune1的例子,它調(diào)用了一個(gè)函數(shù)名為rtExtModeCheckInit的子函數(shù),如果想讓程序執(zhí)行到該函數(shù)處停止,可以在gdb提示符下輸入:break rtExtModeChe
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1