基礎(chǔ)實驗題目

上傳人:仙*** 文檔編號:37661199 上傳時間:2021-11-04 格式:DOC 頁數(shù):15 大?。?38KB
收藏 版權(quán)申訴 舉報 下載
基礎(chǔ)實驗題目_第1頁
第1頁 / 共15頁
基礎(chǔ)實驗題目_第2頁
第2頁 / 共15頁
基礎(chǔ)實驗題目_第3頁
第3頁 / 共15頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《基礎(chǔ)實驗題目》由會員分享,可在線閱讀,更多相關(guān)《基礎(chǔ)實驗題目(15頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、基礎(chǔ)實驗題目 目錄 實驗一 線性表的基礎(chǔ)訓練(2次上機) 2 實驗二 棧、隊列及其應用(1.5~2.5次上機) 3 實驗三 二叉樹及其應用(2次上機) 5 實驗四 圖及其應用(2~3次上機) 7 附錄 Makefile 、GCC、pkg-config 使用說明 8 1.GCC的使用 8 2.pkg-config的作用 11 3.Makefile的作用 11 實驗一 線性表的基礎(chǔ)訓練(1~2次上機) 【上機時間】 第1~2次 【實驗目的】 熟悉掌握本門課程所使用的程序設計語言(C語言),體會算法與程序之間的區(qū)別: 1、 熟悉VC等編程環(huán)

2、境,學會單步跟蹤、調(diào)試自己的程序; 2、 了解project的創(chuàng)建、使用以及意義; 3、 熟練定義含指向結(jié)構(gòu)體自身的指針域的結(jié)構(gòu)體類型,掌握此類變量、指針變量的初始化、賦值、輸入/輸出、參數(shù)傳遞; 4、 熟練使用C中的動態(tài)分配與釋放函數(shù)(malloc, realloc, free); 5、 熟悉帶參數(shù)的main函數(shù)的編寫與運行; 6、 類C的引用參數(shù)在C中的變換處理; 7、 利用輸入導向,從文件中獲取輸入數(shù)據(jù)。 初步理解線性表的順序存儲和鏈式存儲特性,掌握在不同存儲結(jié)構(gòu)、不同約定下,其基本操作的實現(xiàn)方法與差異。體會以下幾點(注意你所做的約定): 1、 靜態(tài)分配的順序表及增量

3、式分配的順序表在表示與實現(xiàn)上的差別,各有何特點; 2、 有頭結(jié)點的鏈表與無頭結(jié)點鏈表在操作實現(xiàn)上的區(qū)別; 3、 頭插法與尾插法的操作方法及應用效果對比; 4、 插入、刪除操作在順序存儲和鏈式存儲上的差別; 5、 非循環(huán)單鏈表、循環(huán)單鏈表各適用于解決哪些問題,它們在數(shù)據(jù)類型定義、操作的定義及實現(xiàn)上各有什么區(qū)別? 6、 靜態(tài)鏈表與動態(tài)鏈表之間的映射與差別(自選)。 【實驗要求】 1、 下載Gzip的相關(guān)資源,用VC為Gzip建立project,編譯并運行Gzip;給出3種以上的命令行輸入,單步跟蹤Gzip對命令行參數(shù)的處理;學習帶參的main的使用與編程。消化理解一些標識符和文件

4、操作。 目的:開展程序理解的第一階段。 2、 下載ch2.rar并閱讀其中的代碼。其中c1.h是第1章預設的一些宏和類型名, c2-1.h是順序表的類型定義,c2-2.h是鏈表的類型定義,bo2-1.c是ADT List中基本操作的順序表實現(xiàn), bo2-2.c是ADT List中基本操作的鏈表實現(xiàn),algo2-1.c是例2-1的順序表實現(xiàn),algo2-12.c是例2-1的鏈表實現(xiàn),algo2-12a.c是改寫algo2-12.c的Union()函數(shù)。 目的:體會用偽C表示的算法和C程序之間的差異。 3、 閱讀《數(shù)據(jù)結(jié)構(gòu)題集》P79 1.2約瑟夫環(huán),理解約瑟夫環(huán)的定義。編寫一個程序,該程

5、序根據(jù)輸入的命令行參數(shù)創(chuàng)建一個單循環(huán)鏈表表示的約瑟夫環(huán),然后輸出約瑟夫環(huán)出列的順序。 命令行格式: 〈可執(zhí)行程序名〉〈人數(shù)n〉〈初始的報數(shù)上限m〉〈密碼1〉 …… 〈密碼n〉 第1個參數(shù)是你所編寫的程序的可執(zhí)行文件名, 第2個參數(shù)是指定形成約瑟夫環(huán)的人數(shù)n 第3個參數(shù)是指定初始的報數(shù)上限m 后面n個參數(shù)是n個人所持有的整數(shù)密碼。 當除可執(zhí)行程序名外,沒有參數(shù)時,將繼續(xù)執(zhí)行程序并提示用戶輸入這些參數(shù)。 基本要求: 1)假設命令行參數(shù)是齊全的且是正確的,運行所編寫的程序能正確地輸出結(jié)果; 2)能將輸出結(jié)果導到文件中。 實驗提示: 該實驗的處理可分以下幾個模塊: 1)命

6、令行參數(shù)的處理; 2)單循環(huán)鏈表的創(chuàng)建; 3)根據(jù)m和起始報數(shù)人對應在單循環(huán)鏈表中的位置,確定出列人的位置; 4)刪除出列人對應的結(jié)點。 選作要求: 1)程序有對命令行參數(shù)不全或不正確的處理(如提示輸入、報錯等); 2)將約瑟夫環(huán)用順序表實現(xiàn)。 4、 撰寫實驗報告。 【檢查期限】 1、 上機內(nèi)容檢查時間:第2次和第3次上機時,以第3次上機為截止時間; 2、 報告上交截止時間:第2次上機后的第一次課的上課前截止。 實驗二 棧、隊列及其應用(1.5~2.5次上機) 【上機時間】 第3次,第4次 【實驗目的】 深入理解棧和隊列的特性,領(lǐng)會它們各自的應用背景

7、。熟練掌握它們在不同存儲結(jié)構(gòu)、不同的約定中,其基本操作的實現(xiàn)方法與差異。體會以下幾點(注意你所做的約定): 1、 棧:順序棧(???棧滿條件,入棧/出棧)、鏈棧(棧空條件,入棧/出棧); 2、 隊列:鏈隊列(隊空條件,入隊/出隊)、順序隊列/循環(huán)順序隊列(隊空/隊滿條件,入隊/出隊); 【實驗內(nèi)容】 本次實驗共五個題目,可任選其中的一題或多題。 1. 魔王語言解釋 具體要求參見《數(shù)據(jù)結(jié)構(gòu)題集》P97,實習2.2中的描述。 2. 算術(shù)表達式求值的演示 具體要求參見《數(shù)據(jù)結(jié)構(gòu)題集》P99實習2.5中的描述。 3. N-皇后問題 假設有一NN的棋盤和N個皇后,請為這

8、N個皇后進行布局使得這N個皇后互不攻擊(即任意兩個皇后不在同一行、同一列、同一對角線上。 要求: 1) 輸入N,輸出N個皇后互不攻擊的布局; 2) 要求用非遞歸方法來解決N-皇后問題,即自己設置棧來處理。 4. 背包問題 假設有一個能裝入總體積為T的背包和n件體積分別為w1 , w2 , … , wn 的物品,能否從n件物品中挑選若干件恰好裝滿背包,即使w1 +w2 + … + wn=T,要求找出所有滿足上述條件的解。 例如:當T=10,各件物品的體積{1,8,4,3,5,2}時,可找到下列4組解: (1,4,3,2) (1,4,5)

9、 (8,2) (3,5,2)。 提示:可利用回溯法的設計思想來解決背包問題。 首先將物品排成一列,然后順序選取物品裝入背包,假設已選取了前i 件物品之后背包還沒有裝滿,則繼續(xù)選取第i+1件物品,若該件物品“太大”不能裝入,則棄之而繼續(xù)選取下一件,直至背包裝滿為止。但如果在剩余的物品中找不到合適的物品以填滿背包,則說明“剛剛”裝入背包的那件物品“不合適”,應將它取出“棄之一邊”,繼續(xù)再從“它之后”的物品中選取,如此重復,直至求得滿足條件的解,或者無解。 5. MML命令解釋 說明:MML命令又稱人機交互語言,作用就是客戶端通過發(fā)送有意義的命令字符串

10、來獲取服務器的服務。它的格式有很多種,它的格式有很多種,我們要支持下面兩種: 1) 命令字:{參數(shù)1=參數(shù)1值,參數(shù)2=參數(shù)2值,.....},{......},.......... 有一個命令字和很多的參數(shù)塊,每個參數(shù)塊中有很多的參數(shù),參數(shù)之間用逗號 隔開參數(shù)值的類型有兩種,整型和字符串。 2) 命令字:{.........},{..........};命令字:{...},{...}................;命令字:{.....},...... 有很多的命令字,每兩個命令字之間用分號隔開,每個命令字可以有很多的參數(shù)塊,每個參數(shù)塊的內(nèi)容同格式1); 基本要求: 1)

11、提取所有的參數(shù)及其值,其中值為用雙/單引號括住的字符串值或者整型值; 2) 打印有多少個命令字和參數(shù)塊個數(shù)以及參數(shù)的個數(shù); 3) 遇到非法輸入要報警; 附加要求: 1) 對非法輸入報告其類型,如字符串沒有引號等等; 2) 限定參數(shù)必須為合法的標識符(即字母或下劃線開始的、由字母數(shù)字下劃線組成的字符串),對非法的標識符要報錯; 補充:如果程序的健壯性很強,即遇到精心設計的測試用例不會死機,可以提示輸入錯,則加分。 【實驗要求】 1. 要求所編寫的程序應: a) 必須帶命令行參數(shù); b) 必須通過命令行參數(shù)指定輸入、輸出文件的文件名,練習對文件的操作。 2. 撰寫實驗報告

12、。 【檢查期限】 1. 上機內(nèi)容檢查時間:第3~5次上機時,以第5次上機為截止時間; 2. 報告上交截止時間:第4次上機后的第一次課的上課前截止。 實驗三 二叉樹及其應用(2次上機) 【上機時間】 第5~7次 【實驗目的】 樹是一種應用極為廣泛的數(shù)據(jù)結(jié)構(gòu)之一,是本課程的重點。樹是一種1:N的非線性結(jié)構(gòu)。本章首先以二叉樹這種特殊、簡單的樹為原型,討論數(shù)據(jù)元素(結(jié)點)之間的1:N(N=0,1,2)關(guān)系的表示(順序映像——完全二叉樹的順序存儲;鏈式映像——二叉鏈表、三叉鏈表);重點介紹二叉樹的各種遍歷算法(先序、中序、后序、層次遍歷);并以這些遍歷算法為基礎(chǔ),進一步討論二叉

13、樹的其他各種問題的求解算法。然后,展開對一般樹的表示(雙親表示法、孩子表示法、孩子-兄弟表示法)和操作算法的討論;強調(diào)樹(森林)的孩子-兄弟表示法及其相關(guān)應用;并將表示樹(森林)的孩子-兄弟鏈映射到表示二叉樹的二叉鏈,從而獲得樹(森林)與二叉樹的相互轉(zhuǎn)換。 本實驗以二叉樹的鏈式表示、建立和應用為基礎(chǔ),旨在讓學生深入了解二叉樹的存儲表示特征以及遍歷次序與二叉樹的存儲結(jié)構(gòu)之間的關(guān)系,進一步掌握利用遍歷思想解決二叉樹中相關(guān)問題的方法。 本實驗的另一個目的是讓學生通過思考、上機實踐與分析總結(jié),理解計算機進行算術(shù)表達式解析、計算的可能方法,初步涉及一些編譯技術(shù),增加自己今后學習編譯原理的興趣,并奠定

14、一些學習的基礎(chǔ)。 【實驗內(nèi)容】 本實驗由以下環(huán)節(jié)組成: 1) 存儲結(jié)構(gòu) 以二叉鏈表或三叉鏈表作為二叉樹的存儲結(jié)構(gòu); 2) 二叉樹的創(chuàng)建(鏈式存儲) 以某一種遍歷的次序錄入二叉樹的元素,寫出相應的二/三叉鏈表的創(chuàng)建算法,并上機實現(xiàn)該算法; 二叉樹的輸入次序可以有如下幾種方法,你可以選擇其中之一來作為二/三叉鏈表創(chuàng)建程序的輸入: A B C E D F G H 圖 1 (1) 添加虛結(jié)點補足成完全二叉樹,對補足虛結(jié)點后的二叉樹按層次遍歷次序輸入。 如圖1的二叉樹輸入次序為: A, B, C, F, D, E, F, F, F,

15、 G, F, F, H 也可以通過添加虛結(jié)點,為每一實在結(jié)點補足其孩子,再對補足虛結(jié)點后的二叉樹按層次遍歷的次序輸入。 如圖1的二叉樹輸入次序為: A, B, C, F, D, E, F, G, F, F, H, F, F, F, F, F, F 進一步改進,可以在輸入列表中忽略出現(xiàn)在列表尾部的虛結(jié)點,即: A, B, C, F, D, E, F, G, F, F, H (2) 通過添加虛結(jié)點,將二叉樹中的每一實在結(jié)點補足成度為2的結(jié)點,對補足虛結(jié)點后的二叉樹按先序遍歷的次序輸入。 如圖1的二叉樹輸入次序為: A, B, F, D, G, F, F, F,

16、 C, E, F, H, F, F, F, F, F (3) 依次輸入二叉樹的中序和后序遍歷的結(jié)果。 如圖1的二叉樹輸入次序為: 中序:B, G, D, A, E, H, C, F 后序:G, D, B, H, E, F, C, A (4) 依次輸入二叉樹的中序和先序遍歷的結(jié)果。 如圖1的二叉樹輸入次序為: 中序:B, G, D, A, E, H, C, F 先序:A, B, D, G, C, E, H, F 3) 二叉樹的遍歷 對所建的二叉樹進行驗證:按初始輸入元素采用的遍歷方法遍歷該二叉樹,看遍歷的結(jié)果是否與初始輸入一致; 4) 二叉樹的應用:線索二叉

17、樹的創(chuàng)建 基于二叉樹遍歷思想的其它問題的求解:擴展二叉樹的存儲結(jié)構(gòu),增加表示直接后繼線索的鏈域,給出創(chuàng)建給定二叉樹的后序線索化二叉樹的程序; 5) 線索二叉樹的遍歷 編寫在后序線索化樹上的遍歷算法。 6) 二叉樹創(chuàng)建的特例——表達式樹 在2)基礎(chǔ)上,設計并實現(xiàn)為輸入表達式(僅考慮運算符為雙目運算符的情況)創(chuàng)建表達式樹的程序: A) 先實現(xiàn)輸入為合法的波蘭式; B) 進一步考慮輸入為中綴表達式(需要分析優(yōu)先級和結(jié)合性) C) 考慮輸入為合法的逆波蘭式; 7) 二叉樹遍歷的特例——表達式樹 針對用6)創(chuàng)建的表達式樹,用3)遍歷(先序/中序/后序)該樹,比較它與實際的波蘭式、中綴

18、式和逆波蘭式之間的區(qū)別; 8) 二叉樹的應用——表達式求值與轉(zhuǎn)換 基于3)的后序遍歷或基于5), A)完成給定表達式樹的表達式求值運算; B)輸出表達式的另一種表示方法(如波蘭式、逆波蘭式或中綴表達式)。 【實驗要求】 1. 每一學生必須完成以下內(nèi)容: a) 1)至5) b) 6)中的A)、B)、C)之一 c) 7)以及8)中的A)、B) 之一。 2. 其余部分可以根據(jù)自己的實際情況酌情處理。 【檢查期限】 1. 上機內(nèi)容檢查時間:第6~8次上機時,以第8次上機為截止時間; 2. 報告上交截止時間:第7次上機后的第1次課上課前截止。 實驗四 圖及其應

19、用(2~3次上機) 【上機時間】 第8~10次 【實驗目的】 圖是另一種應用極為廣泛的數(shù)據(jù)結(jié)構(gòu),是本課程的重點。圖是一種M:N的非線性結(jié)構(gòu)。在圖的學習中,首先要解決如何表示圖中頂點之間的關(guān)系。在教材中給出了鄰接矩陣、鄰接表、鄰接多重表、十字鏈表四種存儲結(jié)構(gòu),不同的存儲結(jié)構(gòu)有不同的應用范圍(要求熟練掌握前兩種存儲結(jié)構(gòu))。其次,必須理解深度優(yōu)先搜索和廣度優(yōu)先搜索的特征,熟練寫出它們在ADT Graph以及在不同存儲結(jié)構(gòu)下的算法實現(xiàn),并基于它們進一步掌握生成森林(樹)的構(gòu)造、連通分量的確定、關(guān)節(jié)點的查找等算法。再次,要能理解最小生成樹的普里姆和克魯斯卡爾算法,分析它們各自的特征以及時空特性。

20、最后,掌握有向無環(huán)圖的應用,重點掌握拓撲排序(入度),理解如何利用拓撲排序進行關(guān)鍵路徑的求解;理解在網(wǎng)中如何求從某源點到其它頂點以及任意兩個頂點之間的最短路徑(可以結(jié)合最小生成樹理解)。 本實驗是圖的基礎(chǔ)實驗,旨在讓學生熟練掌握圖的存儲表示特征,各類圖的創(chuàng)建、遍歷方法以及基于遍歷的算法應用。 【實驗題目】 1、 圖的存儲結(jié)構(gòu)的定義和圖的創(chuàng)建 圖的種類有:有向圖、無向圖、有向網(wǎng)、無向網(wǎng)。 圖的存儲結(jié)構(gòu)可采用:鄰接矩陣、鄰接表。 要求:分別給出鄰接矩陣和鄰接表在某一種圖上的創(chuàng)建算法 2、 圖的遍歷:非遞歸的深度優(yōu)先搜索算法、廣度優(yōu)先搜索算法。 3、 圖的深度遍歷的應用:求無向連通圖

21、中的關(guān)節(jié)點(教材P177-178,算法7.10和7.11) 4、 圖的廣度遍歷的應用:給定圖G,輸出從頂點v0到其余每個頂點的最短路徑,要求輸出各路徑中的頂點信息。 【實驗要求】 1. 每一學生必須完成上述所有題 2. 進一步熟悉靜態(tài)鏈的應用: 習題集7.25,以及依據(jù)此存儲結(jié)構(gòu)的3和4的實現(xiàn) 本項內(nèi)容可以根據(jù)自己的實際情況酌情處理,但是必須在實驗報告中附上自己對靜態(tài)鏈的體會(可以結(jié)合在樹中的作業(yè)練習等來闡明)。 【檢查期限】 1. 上機內(nèi)容檢查時間:第9~10次上機時,以第10次上機為截止時間; 2. 報告上交截止時間:第10次上機后的第1次課上課前截止。 附

22、錄 Makefile 、GCC、pkg-config 使用說明 1. GCC的使用 2. pkg-config的作用 3. Makefile的作用 此教程還不夠完整,很多地方比較簡陋,打算以后再不斷完整它,現(xiàn)在來說用這個教程的內(nèi)容已經(jīng)能夠開發(fā)程序了。 1.GCC的使用 通常所說的GCC是GUN Compiler Collection的簡稱,除了編譯程序之外,它還含其他相關(guān)工具,所以它能把易于人類使用的高級語言編寫的源代碼構(gòu)建成計算機能夠直接執(zhí)行的二進制代碼。GCC是Linux平臺下最常用的編譯程序,它是Linux平臺編譯器的事實標準。同時,在Linux平臺下的嵌入式開發(fā)領(lǐng)

23、域,GCC也是用得最普遍的一種編譯器。GCC之所以被廣泛采用,是因為它能支持各種不同的目標體系結(jié)構(gòu)。例如,它既支持基于宿主的開發(fā)(簡單講就是要為某平臺編譯程序,就在該平臺上編譯),也支持交叉編譯(即在A平臺上編譯的程序是供平臺B使用的)。目前,GCC支持的體系結(jié)構(gòu)有四十余種,常見的有X86系列、Arm、 PowerPC等。同時,GCC還能運行在不同的操作系統(tǒng)上,如Linux、Solaris、Windows等。 除了上面講的之外,GCC除了支持C語言外,還支持多種其他語言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。 程序的編譯過程 對于GUN

24、編譯器來說,程序的編譯要經(jīng)歷預處理、編譯、匯編、連接四個階段。 從功能上分,預處理、編譯、匯編是三個不同的階段,但GCC的實際操作上,它可以把這三個步驟合并為一個步驟來執(zhí)行。 在預處理階段,輸入的是C語言的源文件,通常為*.c。它們通常帶有.h之類頭文件的包含文件。這個階段主要處理源文件中的#ifdef、 #include和#define命令。該階段會生成一個中間文件*.i,但實際工作中通常不用專門生成這種文件,因為基本上用不到;若非要生成這種文件不可,可以利用下面的示例命令: gcc -E main.c -o main.i 在編譯階段,輸入的是中間文件*.i,編譯后生成匯編語

25、言文件*.s 。這個階段對應的GCC命令如下所示: gcc -S main.i -o main.s 在匯編階段,將輸入的匯編文件*.s轉(zhuǎn)換成機器語言*.o。這個階段對應的GCC命令如下所示: gcc -c main.s -o main.0 最后,在連接階段將輸入的機器代碼文件*.s(與其它的機器代碼文件和庫文件)匯集成一個可執(zhí)行的二進制代碼文件。這一步驟,可以利用下面的示例命令完成: gcc main.o -o main GCC常用模式 這里介紹GCC追常用的兩種模式:編譯模式和編譯連接模式。下面以一個例子來說明各種模式的使用方法。為簡單起見,假設我們?nèi)康脑?/p>

26、代碼都在一個文件main.c中,要想把這個源文件直接編譯成可執(zhí)行程序,可以使用以下命令: gcc -o main main.c 這里main.c是源文件,生成的可執(zhí)行代碼存放在一個名為main 的文件中(該文件是機器代碼并且可執(zhí)行)。-o 是生成可執(zhí)行文件的輸出選項。如果我們只想讓源文件生成目標文件(給文件雖然也是機器代碼但不可執(zhí)行),可以使用標記-c ,詳細命令如下所示: gcc -c main.c 默認情況下,生成的目標文件被命名為main.o,但我們也可以為輸出文件指定名稱,如下所示: gcc -c main.c -o m.o 上面這條命令將編譯后的目

27、標文件命名為m.o,而不是默認的main.o。 迄今為止,我們談論的程序僅涉及到一個源文件;現(xiàn)實中,一個程序的源代碼通常包含在多個源文件之中,這該怎么辦?沒關(guān)系,即使這樣,用GCC處理起來也并不復雜,見下例: gcc -o main 1.c 2.c 3.c 需要注意的是,要生成可執(zhí)行程序時,一個程序無論有有一個源文件還是多個源文件,所有被編譯和連接的源文件中必須有且僅有一個main函數(shù),因為main 函數(shù)是該程序的入口點(換句話說,當系統(tǒng)調(diào)用該程序時,首先將控制權(quán)授予程序的main函數(shù))。但如果僅僅是把源文件編譯成目標文件的時候,因為不會進行連接,所以main函數(shù)不是必需的。

28、 常用選項 許多情況下,頭文件和源文件會單獨存放在不同的目錄中。例如,假設存放源文件的子目錄名為./src,而包含文件則放在層次的其他目錄下,如./inc。當我們在./src 目錄下進行編譯工作時,如何告訴GCC到哪里找頭文件呢?方法如下所示: gcc test.c –I../inc -o test 上面的命令告訴GCC包含文件存放在./inc 目錄下,在當前目錄的上一級。如果在編譯時需要的包含文件存放在多個目錄下,可以使用多個-I 來指定各個目錄: gcc test.c –I../inc1 –I../../inc2 -o test 這里指出了另一個包含子目錄i

29、nc2,較之前目錄它還要在再上兩級才能找到。 另外,我們還可以在編譯命令行中定義符號常量。為此,我們可以簡單的在命令行中使用-D選項即可,如下例所示: gcc -DTEST_CONFIGURATION test.c -o test 上面的命令與在源文件中加入下列命令是等效的: #define TEST_CONFIGURATION 在編譯命令行中定義符號常量的好處是,不必修改源文件就能改變由符號常量控制的行為。 此外,還有一個比較重要的選項,就是指定編譯時需要用到的庫,用法如下: gcc -lcurses main.c 這個例子的意思是使用curse

30、s庫編譯程序。使用-L選項時后面可以放庫的路徑,編譯器就會在指定的目錄里尋找所需的庫。 警告功能 當GCC 在編譯過程中檢查出錯誤的話,它就會中止編譯;但檢測到警告時卻能繼續(xù)編譯生成可執(zhí)行程序,因為警告只是針對程序結(jié)構(gòu)的診斷信息,它不能說明程序一定有錯誤,而是存在風險,或者可能存在錯誤。雖然GCC提供了非常豐富的警告,但前提是你已經(jīng)啟用了它們,否則它不會報告這些檢測到的警告。 在眾多的警告選項之中,最常用的就是-Wall選項。該選項能發(fā)現(xiàn)程序中一系列的常見錯誤警告,該選項用法舉例如下: gcc -Wall main.c -o main 2.pkg-config

31、的作用 (此部分教程還不完整,待添加新內(nèi)容) 在使用GCC編譯和鏈接源代碼時,往往需要指定庫的頭文件地址和庫文件的位置。即使用-I和-L選項(或者-i和-l)。但是,當編寫程序時,往往會需要涉及到多個程序庫,比如編寫GTK+程序時,需要用到的庫有pango、cairo、gobject、gdk等,涉及到的頭文件也很多,一一指定是非常麻煩的。 pkg-config簡單來說,就是一個負責替你指定所用到的頭文件和庫的地址給編譯器的工具,一般來說,最常用的是兩個功能,一是指定編譯程序時需要用到的頭文件地址給編譯器,使用方法: gcc –E main.c –o main.i `pkg-conf

32、ig –cflags gtk+-2.0` 這條命令的意思是,假定main.c是一個GTK+程序,則`pkg-config –cflags gtk+-2.0`這條命令會把這個程序里所用的頭文件地址告訴給gcc。注意,gcc使用-E選項,表示只對main.c做預處理,因為沒有指定庫函數(shù)的地址,不能加載庫函數(shù),即不能可執(zhí)行生成模塊。另外一個重要的功能是告訴編譯器庫的位置,使用方法: Gcc –o main main.i `pkg-config –libs gtk+-.20` 這條命令的意思是,把main.i所可能用到的庫的目錄傳給編譯器,這樣就能編譯連接生成可知性文件了。 關(guān)于pkg-c

33、onfig 就介紹到這里,其他內(nèi)容以后再作補充。 3.Makefile的作用 3.1 Makefile簡介 Makefile是GNU Make的輸入文件,用來指示make怎樣自動編譯源代碼。這個文 件里主要是有關(guān)哪些文件(‘target’目的文件)是從哪些別的 文件(‘dependencies’依靠文件)中產(chǎn)生的,用什么命令來進行 這個產(chǎn)生過程。有了這些信息, make 會檢查硬盤上的文件,如果 目的文件的時間戳(該文件生成或被改動時的時間)比至少它的一個依靠文件舊的話, make 就執(zhí)行相應的命令,以便更新目的文件。(目的文件不一定是最后的可執(zhí)行檔,它可以是任何一個文件。) Ma

34、kefile 一般被叫做“Makefile”或“makefile”。當然你可以 在 make 的命令行指定別的文件名。如果你不特別指定,它會尋 找“makefile”或“Makefile”,因此使用這兩個名字是最簡單 的。 一個 makefile 主要含有一系列的規(guī)則,如下: : ... (tab) (tab) . 例如,考慮以下的 makefile : ----------------------------------------------------------- myprog : foo.o bar.o gcc foo.o

35、 bar.o -o myprog foo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.o bar.o : bar.c bar.h gcc -c bar.c -o bar.o ----------------------------------------------------------- 這是一個非?;镜?makefile —— make 從最上面開始,把上 面第一個目的,‘myprog’,做為它的主要目標(一個它需要保 證其總是最新的最終目標)。給出的規(guī)則說明只要文件‘myprog’ 比文件‘foo.o’或‘bar

36、.o’中的任何一個舊,下一行的命令將 會被執(zhí)行。 但是,在檢查文件 foo.o 和 bar.o 的時間戳之前,它會往下查 找那些把 foo.o 或 bar.o 做為目標文件的規(guī)則。它找到的關(guān)于 foo.o 的規(guī)則,該文件的依靠文件是 foo.c, foo.h 和 bar.h 。 它從下面再找不到生成這些依靠文件的規(guī)則,它就開始檢查磁碟 上這些依靠文件的時間戳。如果這些文件中任何一個的時間戳比 foo.o 的新,命令 gcc -o foo.o foo.c 將會執(zhí)行,從而更新 文件 foo.o 。 接下來對文件 bar.o 做類似的檢查,依靠文件在這里是文件 bar.c 和 bar.h 。

37、現(xiàn)在, make 回到‘myprog’的規(guī)則。如果剛才兩個規(guī)則中的任 何一個被執(zhí)行,myprog 就需要重建(因為其中一個 .o 檔就會比 ‘myprog’新),因此連接命令將被執(zhí)行。 3.2 編寫 make 規(guī)則 (Rules) 最簡單的編寫規(guī)則的方法是一個一個的查 看源碼文件,把它們的目標文件做為目的,而C源碼文件和被它 #include 的 header 檔做為依靠文件。但是你也要把其它被這些 header 檔 #include 的 header 檔也列為依靠文件,還有那些被 包括的文件所包括的文件……然后你會發(fā)現(xiàn)要對越來越多的文件 進行管理,然后你的頭發(fā)開始脫落,你的脾氣開始變

38、壞,你的臉 色變成菜色,你走在路上開始跟電線桿子碰撞,終于你搗毀你的 電腦顯示器,停止編程。到低有沒有些容易點兒的方法呢? 當然有!向編譯器要!在編譯每一個源碼文件的時候,它實在應 該知道應該包括什么樣的 header 檔。使用 gcc 的時候,用 -M 開關(guān),它會為每一個你給它的C文件輸出一個規(guī)則,把目標文件 做為目的,而這個C文件和所有應該被 #include 的 header 文 件將做為依靠文件。注意這個規(guī)則會加入所有 header 文件,包 括被角括號(`<, `>)和雙引號(`")所包圍的文件。其實我們可以 相當肯定系統(tǒng) header 檔(比如 stdio.h, stdl

39、ib.h 等等)不會 被我們更改,如果你用 -MM 來代替 -M 傳遞給 gcc,那些用角括 號包圍的 header 檔將不會被包括。(這會節(jié)省一些編譯時間) 由 gcc 輸出的規(guī)則不會含有命令部分;你可以自己寫入你的命令 或者什么也不寫,而讓 make 使用它的隱含的規(guī)則。 3.3 Makefile 變量 上面提到 makefiles 里主要包含一些規(guī)則。它們包含的其它的東西是變量定義。 makefile 里的變量就像一個環(huán)境變量(environment variable)。 事實上,環(huán)境變量在 make 過程中被解釋成 make 的變量。這些 變量是大小寫敏感的,一般使

40、用大寫字母。它們可以從幾乎任何 地方被引用,也可以被用來做很多事情,比如: i) 貯存一個文件名列表。在上面的例子里,生成可執(zhí)行文件的 規(guī)則包含一些目標文件名做為依靠。在這個規(guī)則的命令行 里同樣的那些文件被輸送給 gcc 做為命令參數(shù)。如果在這 里使用一個變數(shù)來貯存所有的目標文件名,加入新的目標 文件會變的簡單而且較不易出錯。 ii) 貯存可執(zhí)行文件名。如果你的項目被用在一個非 gcc 的系 統(tǒng)里,或者如果你想使用一個不同的編譯器,你必須將所 有使用編譯器的地方改成用新的編譯器名。但是如果使用一 個變量來代替編譯器名,那么你只需要改變一個地方,其 它所有地方的命令名

41、就都改變了。 iii) 貯存編譯器旗標。假設你想給你所有的編譯命令傳遞一組 相同的選項(例如 -Wall -O -g);如果你把這組選項存 入一個變量,那么你可以把這個變量放在所有呼叫編譯器 的地方。而當你要改變選項的時候,你只需在一個地方改 變這個變量的內(nèi)容。 要設定一個變量,你只要在一行的開始寫下這個變量的名字,后 面跟一個 = 號,后面跟你要設定的這個變量的值。以后你要引用 這個變量,寫一個 $ 符號,后面是圍在括號里的變量名。比如在 下面,我們把前面的 makefile 利用變量重寫一遍: -------------------------------------

42、--------------------------- OBJS = foo.o bar.o CC = gcc CFLAGS = -Wall -O -g myprog : $(OBJS) $(CC) $(OBJS) -o myprog foo.o : foo.c foo.h bar.h $(CC) $(CFLAGS) -c foo.c -o foo.o bar.o : bar.c bar.h $(CC) $(CFLAGS) -c bar.c -o bar.o ----------------------------------------------

43、------------------ 還有一些設定好的內(nèi)部變量,它們根據(jù)每一個規(guī)則內(nèi)容定義。三個 比較有用的變量是 $@, $< 和 $^ (這些變量不需要括號括?。?。 $@ 擴展成當前規(guī)則的目的文件名, $< 擴展成依靠列表中的第 一個依靠文件,而 $^ 擴展成整個依靠的列表(除掉了里面所有重 復的文件名)。利用這些變量,我們可以把上面的 makefile 寫成: ---------------------------------------------------------------- OBJS = foo.o bar.o CC = gcc CFLAGS = -Wall -O

44、 -g myprog : $(OBJS) $(CC) $^ -o $@ foo.o : foo.c foo.h bar.h $(CC) $(CFLAGS) -c $< -o $@ bar.o : bar.c bar.h $(CC) $(CFLAGS) -c $< -o $@ ---------------------------------------------------------------- 你可以用變量做許多其它的事情,特別是當你把它們和函數(shù)混合 使用的時候。如果需要更進一步的了解,請參考 GNU Make 手冊。 另外,配合使用pkg

45、-config,你可以在把代碼所用的頭文件和庫函數(shù)位置放在變量里。比如,在編寫GTK+程序時,可以這樣設置一個變量: GTK_FLAGS=$(shell pkg-config --libs --cflags "gtk+-2.0") 然后在規(guī)則里使用它: gcc main.c -o simple $(GTK_FLAGS) 3.4 隱含規(guī)則 (Implicit Rules) 請注意,在上面的例子里,幾個產(chǎn)生 .o 文件的命令都是一樣的。 都是從 .c 文件和相關(guān)文件里產(chǎn)生 .o 文件,這是一個標準的步 驟。其實 make 已經(jīng)知道怎么做——它有一些叫做隱含規(guī)則的內(nèi) 置的規(guī)則,這些

46、規(guī)則告訴它當你沒有給出某些命令的時候,應該 怎么辦。 如果你把生成 foo.o 和 bar.o 的命令從它們的規(guī)則中刪除, make 將會查找它的隱含規(guī)則,然后會找到一個適當?shù)拿?。它的命令?使用一些變量,因此你可以按照你的想法來設定它:它使用變量 CC 做為編譯器(象我們在前面的例子),并且傳遞變量 CFLAGS (給 C 編譯器,C++ 編譯器用 CXXFLAGS ),CPPFLAGS ( C 預 處理器旗標), TARGET_ARCH (現(xiàn)在不用考慮這個),然后它加 入旗標 -c ,后面跟變量 $< (第一個依靠名),然后是旗 標 -o 跟變量 $@ (目的文件名)。一個C編

47、譯的具體命令將 會是: $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ 當然你可以按照你自己的需要來定義這些變量。這就是為什么用 gcc 的 -M 或 -MM 開關(guān)輸出的碼可以直接用在一個 makefile 里。 3.5 假象目的 (Phony Targets) 假設你的一個項目最后需要產(chǎn)生兩個可執(zhí)行文件。你的主要目標 是產(chǎn)生兩個可執(zhí)行文件,但這兩個文件是相互獨立的——如果一 個文件需要重建,并不影響另一個。你可以使用“假象目的”來 達到這種效果。一個假象目的跟一個正常的目的幾乎是一樣的, 只是這個目的文件

48、是不存在的。因此, make 總是會假設它需要 被生成,當把它的依賴文件更新后,就會執(zhí)行它的規(guī)則里的命令 行。 如果在我們的 makefile 開始處輸入: all : exec1 exec2 其中 exec1 和 exec2 是我們做為目的的兩個可執(zhí)行文件。 make 把這個 all 做為它的主要目的,每次執(zhí)行時都會嘗試把 all 更新。但既然這行規(guī)則里沒有哪個命令來作用在一個叫 all 的 實際文件(事實上 all 并不會在磁碟上實際產(chǎn)生),所以這個規(guī) 則并不真的改變 all 的狀態(tài)??杉热贿@個文件并不存在,所以 make 會嘗試更新 all 規(guī)則,因此就檢

49、查它的依靠 exec1, exec2 是否需要更新,如果需要,就把它們更新,從而達到我們的目的。 假象目的也可以用來描述一組非預設的動作。例如,你想把所有由 make 產(chǎn)生的文件刪除,你可以在 makefile 里設立這樣一個規(guī)則: clean : rm *.o rm myprog 前提是沒有其它的規(guī)則依靠這個 veryclean 目的,它將永遠 不會被執(zhí)行。但是,如果你明確的使用命令 make veryclean , make 會把這個目的做為它的主要目標,執(zhí)行那些 rm 命令。 如果你的硬盤上存在一個叫 clean 文件,會發(fā)生什么事?這 時因為

50、在這個規(guī)則里沒有任何依靠文件,所以這個目的文件一定是 最新的了(所有的依靠文件都已經(jīng)是最新的了),所以既使用戶明 確命令 make 重新產(chǎn)生它,也不會有任何事情發(fā)生。解決方法是標 明所有的假象目的(用 .PHONY),這就告訴 make 不用檢查它們 是否存在于磁碟上,也不用查找任何隱含規(guī)則,直接假設指定的目 的需要被更新。在 makefile 里加入下面這行包含上面規(guī)則的規(guī)則: .PHONY : clean 就可以了。注意,這是一個特殊的 make 規(guī)則,make 知道 .PHONY 是一個特殊目的,當然你可以在它的依靠里加入你想用的任何假象目的,而make 知道它們都是假象目的。 關(guān)于Makefile、GCC、pkg-config的介紹就到這里,這個文檔大量使用了網(wǎng)絡上的資源,在以后,我會把它整理成我自己的內(nèi)容。此文檔不定期更新。 15

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

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲