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