青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-145  評論-173  文章-70  trackbacks-0

GCC(gcc) 的不斷發展完善使許多商業編譯器都相形見絀, GCC GNU 創始人 Richard Stallman首創,是 GNU 的標志產品,由于 UNIX 平臺的高度可移植性, GCC 幾乎在各種常見的 UNIX 平臺上都有,即使是 Win32/DOS 也有 GCC 的移植。 比如說 SUN Solaris 操作系統配置的編譯器就是GNU GCC

GNU 軟件包括 C 編譯器 GCC C++ 編譯器 G++ ,匯編器 AS ,鏈接器 LD ,二進制轉換工具(OBJCOPY OBJDUMP) ,調試工具 (GDB GDBSERVER KGDB) 和基于不同硬件平臺的開發庫。

GNU GCC 支持下用戶可以使用流行的 C/C++ 語言開發應用程序,滿足生成高效率運行代碼、易掌握的編程語言的用戶需求。

這些工具都是按 GPL 版權聲明發布,任何人可以從網上獲取全部的源代碼,無需使用任何費用。關于 GNU 和公共許可證協議的詳細資料, 讀者可以參看 GNU 網站的介紹,

http://www.gnu.org/home.html

GNU 開發工具都是采用命令行的方式,用戶掌握起來相對比較困難,不如基于 Windows 系統的開發工具好用,但是 GNU 工具的復雜性是由于它更貼近編譯器和操作系統的底層,并提供了更大的靈活性。一旦學習和掌握了相關工具后,就了解了系統設計的基礎知識。

運行于 Linux 操作系統下的自由軟件 GNU gcc 編譯器,不僅可以編譯 Linux 操作系統下運行的應用程序,還可以編譯 Linux 內核本身,甚至可以作交叉編譯,編譯運行于其它 CPU 上的程序。所以,在進行嵌入式系統應用程序開發時,這些工具得到了日益廣泛的應用。

GCC GNU 組織的免費 C 編譯器, Linux 的很多發布缺省安裝的就是這種。很多流行的自由軟件源代碼基本都能在 GCC 編譯器下編譯運行。 所以掌握 GCC 編譯器的使用無論是對于編譯系統內核還是自己的應用程序都是大有好處的。

下面通過一個具體的例子,學習如何使用 GCC 編譯器。

Linux 操作系統中,對一個用標準 C 語言寫的源程序進行編譯,要使用 GNU gcc 編譯器。

例如下面一個非常簡單的 Hello 源程序 (hello.c)

/*******************************************************

* Institute of Automation, Chinese Academy of Sciences

* File Name hello.c

* Description introduce how to compile a source file with gcc

* Author Xueyuan Nie

* Date

*******************************************************/

void main()

{

printf("Hello the world\n")

}

要編譯這個程序,我們只要在 Linux bash 提示符下輸入命令:

$ gcc -o hello hello.c

gcc 編譯器就會生成一個 hello 的可執行文件。在 hello.c 的當前目錄下執行 ./hello 就可以看到程序的輸出結果,在屏幕上打印出 “ Hello the world ” 的字符串來。

命令行中 gcc 表示是用 gcc 來編譯源程序;

-o outputfilename 選項表示要求編譯器生成文件名為 outputfilename 的可執行文件,如果不指定 -o 選項,則缺省文件名是 a.out 。在這里生成指定文件名為 hello 的可執行文件,而 hello.c 是我們的源程序文件。

gcc 是一個多目標的工具。 gcc 最基本的用法是:

gcc [options] file...

其中的 option 是以 - 開始的各種選項, file 是相關的文件名。在使用 gcc 的時候,必須要給出必要的選項和文件名。 gcc 的整個編譯過程,實質上是分四步進行的,每一步完成一個特定的工作,

這四步分別是:預處理,編譯,匯編和鏈接。它具體完成哪一步,是由 gcc 后面的開關選項和文件類型決定的。

清楚的區別編譯和連接是很重要的。編譯器使用源文件編譯產生某種形式的目標文件 (objectfiles) 。在這個過程中,外部的符號引用并沒有被解釋或替換,然后我們使用鏈接器來鏈接這些目標文件和一些標準的頭文件,最后生成一個可執行文件。在這個過程中,一個目標文件中對別的文件中的符號的引用被解釋,并報告不能被解釋的引用,一般是以錯誤信息的形式報告出來。

gcc 編譯器有許多選項,但對于普通用戶來說只要知道其中常用的幾個就夠了。在這里為讀者列出幾個最常用的選項:

-o 選項表示要求編譯器生成指定文件名的可執行文件;

-c 選項表示只要求編譯器進行編譯,而不要進行鏈接,生成以源文件的文件名命名但把其后綴由 .c .cc 變成 .o 的目標文件;

-g 選項要求編譯器在編譯的時候提供以后對程序進行調試的信息;

-E 選項表示編譯器對源文件只進行預處理就停止,而不做編譯,匯編和鏈接;

-S 選項表示編譯器只進行編譯,而不做匯編和鏈接;

-O 選項是編譯器對程序提供的編譯優化選項,在編譯的時候使用該選項,可以使生成的執行文件的執行效率提高;

-Wall 選項指定產生全部的警告信息。

如果你的源代碼中包含有某些函數,則在編譯的時候要鏈接確定的庫,比如代碼中包含了某些數學函數,在 Linux 下,為了使用數學函數,必須和數學庫鏈接,為此要加入 -lm 選項。也許有讀者會問,前面那個例子使用 printf 函數的時候為何沒有鏈接庫呢?在 gcc 中對于一些常用函數的實現, gcc 編譯器會自動去鏈接一些常用庫,這樣用戶就沒有必要自己去指定了。有時候在編譯程序的時候還要指定庫的路徑,這個時候要用到編譯器的 -L 選項指定路徑。比如說我們有一個庫在/home/hoyt/mylib 下,這樣我們編譯的時候還要加上 -L/home/hoyt/mylib 。對于一些標準庫來說,沒有必要指出路徑。只要它們在起缺省庫的路徑下就可以了, gcc 在鏈接的時候會自動找到那些庫的。

GNU 編譯器生成的目標文件缺省格式為 elf(executive linked file) 格式,這是 Linux 系統所采用的可執行鏈接文件的通用文件格式。 elf 格式由若干段 (section) 組成,如果沒有特別指明,由標準 c 源代碼生成的目標文件中包含以下段: .text( 正文段 ) 包含程序的指令代碼, .data( 數據段 ) 包含固定的數據,如常量,字符串等, .bss( 未初始化數據段 ) 包含未初始化的變量和數組等。

讀者若想知道更多的選項及其用法,可以查看 gcc 的幫助文檔,那里有許多對其它選項的詳細說明。

當改變了源文件 hello.c 后,需要重新編譯它:

$ gcc -c hello.c

然后重新鏈接生成:

$ gcc o hello.o

對于本例,因為只含有一個源文件,所以當改動了源碼后,進行重新的編譯鏈接的過程顯得并不是太繁瑣,但是,如果在一個工程中包含了若干的源碼文件,而這些源碼文件中的某個或某幾個又被其他源碼文件包含,那么,如果一個文件被改動,則包含它的那些源文件都要進行重新編譯鏈接,工作量是可想而知的。幸運的是, GNU 提供了使這個步驟變得簡單的工具,就是下面要介紹給大家的 GNU Make 工具。

GNU Make

make 是負責從項目的源代碼中生成最終可執行文件和其他非源代碼文件的工具。 make 命令本身可帶有四種參數:標志、宏定義、描述文件名和目標文件名。

其標準形式為:

make [flags] [macro definitions] [targets]

Unix 系統下標志位 flags 選項及其含義為:

-f file 指定 file 文件為描述文件,如果 file 參數為 '-' 符,那么描述文件指向標準輸入。如果沒有 '-f' 參數,則系統將默認當前目錄下名為 makefile 或者名為 Makefile 的文件為描述文件。在Linux 中, GNU make 工具在當前工作目錄中按照 GNUmakefile makefile Makefile 的順序搜索makefile 文件。

-i 忽略命令執行返回的出錯信息。

-s 沉默模式,在執行之前不輸出相應的命令行信息。

-r 禁止使用隱含規則。

-n 非執行模式,輸出所有執行命令,但并不執行。

-t 更新目標文件。

-q make 操作將根據目標文件是否已經更新返回 "0" 或非 "0" 的狀態信息。

-p 輸出所有宏定義和目標文件描述。

-d Debug 模式,輸出有關文件和檢測時間的詳細信息。

Linux make 標志位的常用選項與 Unix 系統中稍有不同,下面只列出了不同部分:

-c dir 在讀取 makefile 之前改變到指定的目錄 dir

-I dir 當包含其他 makefile 文件時,利用該選項指定搜索目錄。

-h help 文擋,顯示所有的 make 選項。

-w 在處理 makefile 之前和之后,都顯示工作目錄。

通過命令行參數中的 target ,可指定 make 要編譯的目標,并且允許同時定義編譯多個目標,操作時按照從左向右的順序依次編譯 target 選項中指定的目標文件。如果命令行中沒有指定目標,則系統默認 target 指向描述文件中第一個目標文件。

make 如何實現對源代碼的操作是通過一個被稱之為 makefile 的文件來完成的,在下面的小節里,主要向讀者介紹一下 makefile 的相關知識。

makefile 基本結構

GNU Make 的主要工作是讀一個文本文件 makefile makefile 是用 bash 語言寫的, bash 語言是很像 BASIC 語言的一種命令解釋語言。這個文件里主要描述了有關哪些目標文件是從哪些依賴文件中產生的,是用何種命令來進行這個產生過程的。有了這些信息, make 會檢查磁盤的文件,如果目標文件的日期 ( 即該文件生成或最后修改的日期 ) 至少比它的一個依賴文件日期早的話, make 就會執行相應的命令,以更新目標文件。

makefile 一般被稱為 “makefile” 或 “Makefile” 。還可以在 make 的命令行中指定別的文件名。如果沒有特別指定的話, make 就會尋找 “makefile” 或 “Makefile” ,所以為了簡單起見,建議讀者使用這兩名字。如果要使用其他文件作為 makefile ,則可利用類似下面的 make 命令選項指定 makefile 文件:

$ make -f makefilename

一個 makefile 主要含有一系列的規則,如下:

目標文件名: 依賴文件名

(tab ) 命令

第一行稱之為規則,第二行是執行規則的命令,必須要以 tab 鍵開始。

下面舉一個簡單的 makefile 的例子。

executable : main.o io.o

gcc main.o io.o -o executable

main.o : main.c

gcc -Wall -O -g -c main.c -o main.o

io.o : io.c

gcc -Wall -O -g -c io.c -o io.o

這是一個最簡單的 makefile make 從第一條規則開始, executable makefile 最終要生成的目標文件。給出的規則說明 executable 依賴于兩個目標文件 main.o io.o ,只要 executable 比它依賴的文件中的任何一個舊的話,下一行的命令就會被執行。但是,在檢查文件 main.o io.o 的日期之前,它會往下查找那些把 main.o io.o 做為目標文件的規則。 make 先找到了關于 main.o 的規則,該目標文件的依賴文件是 main.c makefile 后面的文件中再也找不到生成這個依賴文件的規則了。此時, make 開始檢查磁盤上這個依賴文件的日期,如果這個文件的日期比 main.o 日期新的話,那么這個規則下面的命令 gcc -c main.c o main.o 就會執行,以更新文件 main.o 。同樣 make 對文件 io.o 做類似的檢查,它的依賴文件是 io.c ,對 io.o 的處理和 main.o 類似。現在, 再回到第一個規則處,如果剛才兩個規則中的任何一個被執行,最終的目標文件executable 都需要重建 ( 因為 executable 所依賴的其中一個 .o 文件就會比它新 ) ,因此鏈接命令就會被執行。

有了 makefile ,對任何一個源文件進行修改后,所有依賴于該文件的目標文件都會被重新編譯 ( 因為 .o 文件依賴于 .c 文件 ) ,進而最終可執行文件會被重新鏈接 ( 因為它所依賴的 .o 文件被改變了 ) ,再也不用手工去一個個修改了。

posted on 2009-12-05 00:45 deercoder 閱讀(1523) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线视频免费在线观看一区二区| 欧美va天堂| 中文精品在线| 亚洲国产精品尤物yw在线观看 | 午夜日韩福利| 亚洲欧美激情一区| 亚洲一区国产视频| 久久夜精品va视频免费观看| 国产夜色精品一区二区av| 国产一区91| 国产精品美女久久福利网站| 欧美三级电影精品| 久久人人97超碰精品888| 日韩午夜在线| 韩国欧美一区| 亚洲国产另类久久精品| 黄色日韩精品| 亚洲精品一区二区三区樱花| 在线精品高清中文字幕| 亚洲精品日韩精品| 激情视频一区二区三区| 国产香蕉久久精品综合网| 亚洲看片一区| 亚洲三级色网| 亚洲曰本av电影| 亚洲免费一级电影| 亚洲精品在线一区二区| 午夜精品国产精品大乳美女| 欧美一区二区在线视频| 久久免费高清| 99re视频这里只有精品| 亚洲色图自拍| 国产在线拍揄自揄视频不卡99| 国产精品久久久久久久9999| 精品白丝av| 一本一本a久久| 亚洲欧美日韩精品久久久| 亚洲国产91色在线| 美女国产一区| 亚洲欧美精品在线| 午夜在线一区| 欧美aⅴ一区二区三区视频| 模特精品裸拍一区| 久久久久在线| 国产一区亚洲| 欧美亚洲综合久久| 亚洲欧洲综合另类| 亚洲蜜桃精久久久久久久| 国产精品毛片高清在线完整版| 一本色道婷婷久久欧美| 欧美成人按摩| 久久久九九九九| 欧美日韩在线视频观看| 亚洲欧洲精品成人久久奇米网 | 久久久噜噜噜久噜久久| 亚洲永久精品国产| 欧美日韩一区二区视频在线观看| 在线观看中文字幕不卡| 麻豆91精品| 欧美一进一出视频| 亚洲欧美在线网| 亚洲一二三四久久| 欧美三级电影一区| 亚洲伦理一区| 亚洲一区二区精品在线| 国产一区二区看久久| 久久久综合精品| 欧美成人第一页| 最新成人av在线| 亚洲日本国产| 国产综合欧美| 亚洲人成免费| 国产精品久久久久aaaa九色| 欧美波霸影院| 激情亚洲一区二区三区四区| 亚洲国产精品日韩| 欧美日本在线| 久久精品中文字幕一区| 香蕉成人久久| 亚洲欧美日韩在线高清直播| 亚洲女人天堂av| 亚洲六月丁香色婷婷综合久久| 亚洲高清久久| 久久狠狠婷婷| 亚洲欧美成人综合| 久久婷婷国产综合精品青草| 亚洲一二三区视频在线观看| 亚洲永久免费av| 欧美视频日韩视频在线观看| 久久av红桃一区二区小说| 亚洲性感美女99在线| 欧美午夜电影完整版| 久久爱www.| 另类亚洲自拍| 一区二区日本视频| 午夜精品视频一区| 91久久嫩草影院一区二区| 亚洲啪啪91| 国产亚洲欧美日韩精品| 亚洲国产精品福利| 国产精品jizz在线观看美国| 久久久久www| 欧美久久影院| 久久九九99视频| 欧美日韩精品免费| 久久久999精品| 欧美日韩一区二区三区四区在线观看 | 久久影视精品| 欧美激情乱人伦| 欧美一区国产一区| 欧美激情一区二区在线| 久久www成人_看片免费不卡| 亚洲精选在线观看| 国产在线拍偷自揄拍精品| 一区二区国产在线观看| 精品1区2区| 中日韩视频在线观看| 亚洲国产va精品久久久不卡综合| 国产精品毛片大码女人| 欧美在线视频不卡| 欧美高清一区| 久久一本综合频道| 国产精自产拍久久久久久| 亚洲人永久免费| 亚洲盗摄视频| 久久久夜夜夜| 久久看片网站| 国产日韩欧美一区二区三区在线观看 | 性久久久久久久| 欧美电影免费观看高清| 久热这里只精品99re8久| 国产欧美精品日韩| 亚洲男女毛片无遮挡| 亚洲欧美日韩精品| 国产乱码精品一区二区三| 亚洲毛片在线观看| 亚洲人线精品午夜| 久久影院午夜论| 亚洲人成在线观看一区二区| 国产精品久久看| 免费日韩精品中文字幕视频在线| 欧美色视频一区| 蜜臀av性久久久久蜜臀aⅴ| 欧美亚州在线观看| 欧美激情女人20p| 欧美精品99| 亚洲国产网站| 欧美呦呦网站| 欧美老女人xx| 免费亚洲一区| 日韩亚洲国产精品| 亚洲图片在线| 国产自产女人91一区在线观看| 国产一区二区无遮挡| 欧美日韩网站| 久久亚洲视频| 狠狠爱综合网| 狼人天天伊人久久| 久久久久久黄| 亚洲欧洲精品一区二区三区 | 国产精品久久久久秋霞鲁丝| 亚洲在线黄色| 亚洲一区二区三区高清不卡| 国产精品福利片| 欧美一区二区性| 欧美在线视频一区二区| 在线播放日韩欧美| 久久久久久久一区| 欧美韩日一区二区三区| 亚洲精品乱码| 国产精品日韩在线观看| 久久人人爽人人爽爽久久| 欧美成人按摩| 亚洲综合色婷婷| 欧美一区影院| 亚洲茄子视频| 欧美国产日韩视频| 午夜精品福利视频| 久久经典综合| 亚洲黄页视频免费观看| 亚洲黄网站在线观看| 久久精品视频免费播放| 亚洲中无吗在线| 国产精品美女午夜av| 久久精品在这里| 香港久久久电影| 久久精品国产亚洲a| 亚洲视频999| 在线欧美日韩国产| 亚洲国产欧美一区| 国产精品劲爆视频| 久久久精品日韩欧美| 欧美一区免费| 亚洲欧美日韩一区二区| 久久精品女人| 亚洲尤物影院| 欧美日韩八区| 亚洲日产国产精品| 欧美激情一区二区三区四区| 免费国产自线拍一欧美视频|