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

隨筆-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 閱讀(1525) 評論(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>
            国产一区观看| 亚洲精品影视| 久久激情网站| 久久久青草青青国产亚洲免观| 国产一区二区成人| 久久综合久久综合久久| 久久性色av| 一区二区三区欧美成人| 一区二区三区国产精品| 国产精品一区久久久久| 久久亚洲欧美| 欧美国产日韩二区| 亚洲欧美日韩视频一区| 久久久美女艺术照精彩视频福利播放| 亚洲国产精品第一区二区三区| 亚洲人成小说网站色在线| 欧美另类99xxxxx| 午夜在线视频观看日韩17c| 久久久久欧美| 亚洲欧美精品在线观看| 久久久蜜臀国产一区二区| 一本一本a久久| 久久久精品性| 这里是久久伊人| 久久精品人人| 亚洲一区二区三区涩| 久久九九热免费视频| 亚洲午夜电影网| 美腿丝袜亚洲色图| 欧美影院成人| 欧美三区在线观看| 久久久欧美精品| 国产精品超碰97尤物18| 欧美1区2区视频| 国产精品一区二区你懂的| 亚洲第一页在线| 国产亚洲精品bt天堂精选| 日韩视频中文字幕| 欧美一区二区三区四区在线观看地址| 在线观看精品| 亚洲欧美中文在线视频| 国产精品99久久久久久久女警| 久久激五月天综合精品| 亚洲欧美日韩精品| 欧美日本韩国一区| 欧美黄色日本| 欧美激情精品久久久| 久久亚洲色图| 国产日韩欧美在线一区| 亚洲午夜国产一区99re久久| 一本色道久久88亚洲综合88| 久久婷婷一区| 久久久噜噜噜| 国产亚洲成人一区| 亚洲综合视频在线| 亚洲综合色视频| 国产精品啊啊啊| 99pao成人国产永久免费视频| 最新亚洲激情| 欧美a级片一区| 亚洲高清免费视频| 亚洲美女电影在线| 欧美.com| 亚洲激情中文1区| 亚洲精品视频一区| 欧美精品在线免费播放| 亚洲国产天堂久久综合网| 亚洲人成网站999久久久综合| 美女精品在线观看| 亚洲国产成人久久综合| 最新成人av在线| 欧美噜噜久久久xxx| 日韩亚洲欧美在线观看| 亚洲色诱最新| 国产欧美精品xxxx另类| 欧美一区二区黄色| 可以看av的网站久久看| 亚洲欧洲日产国码二区| 欧美黑人多人双交| 亚洲视频久久| 久久免费精品视频| 亚洲丰满少妇videoshd| 欧美激情二区三区| 亚洲视频欧美视频| 久久日韩粉嫩一区二区三区| 亚洲国产精品va在线看黑人| 欧美激情一区二区三区全黄 | 欧美日韩中文精品| 亚洲一区日本| 久热综合在线亚洲精品| 最新中文字幕亚洲| 国产精品高潮呻吟久久av无限| 亚洲免费视频观看| 牛牛影视久久网| 亚洲午夜av| 精品福利免费观看| 欧美日产在线观看| 欧美在线国产精品| 亚洲欧洲另类| 久久精品人人爽| 一本色道久久综合| 国产亚洲欧洲| 欧美日韩一二三区| 久久国产精品99精品国产| 亚洲青色在线| 久久影院午夜片一区| 亚洲一区二区三区三| 亚洲国产精品精华液2区45| 欧美亚州在线观看| 免费观看不卡av| 亚洲欧美国产日韩天堂区| 亚洲第一精品福利| 欧美在线黄色| av成人免费观看| 悠悠资源网亚洲青| 国产精品夜夜嗨| 欧美日韩a区| 免费成人高清在线视频| 欧美一区二区三区在线看| 亚洲日本va午夜在线影院| 久久综合中文色婷婷| 亚洲欧美日韩国产一区二区三区 | 国产伦精品一区| 欧美日韩国产黄| 久久蜜桃精品| 久久精品国产第一区二区三区最新章节| 亚洲激情综合| 欧美国产大片| 久久综合狠狠综合久久综合88| 香蕉精品999视频一区二区| 中国日韩欧美久久久久久久久| 亚洲日本中文字幕区| 精品va天堂亚洲国产| 国产欧美日韩综合一区在线播放 | 久久精品视频一| 亚洲一二三四区| 一区二区三区精品久久久| 亚洲三级电影在线观看| 欧美电影在线观看| 欧美国产日韩亚洲一区| 欧美大片一区| 欧美成人精品三级在线观看 | 亚洲精品一区二区三区婷婷月| 亚洲大片精品永久免费| 激情小说另类小说亚洲欧美| 国语自产精品视频在线看8查询8| 国产亚洲精品美女| 激情欧美一区二区三区在线观看| 国产亚洲欧美一区| 伊人久久大香线| 亚洲黑丝一区二区| 日韩视频专区| 亚洲自拍偷拍视频| 久久狠狠婷婷| 久热综合在线亚洲精品| 欧美激情一二区| 亚洲精选在线观看| 一区二区三区 在线观看视频| 亚洲美女淫视频| 9色porny自拍视频一区二区| 亚洲一区二区在线免费观看| 性18欧美另类| 久久一区二区三区av| 欧美日本韩国| 久久一区中文字幕| 老司机免费视频一区二区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲大片精品永久免费| 亚洲精品视频在线观看免费| 亚洲网站在线观看| 久久精品中文字幕一区| 欧美—级高清免费播放| 国产精品天天看| 一区二区三区在线观看欧美| 亚洲美女中文字幕| 久久爱www.| 亚洲电影免费在线观看| 亚洲午夜电影在线观看| 久热国产精品视频| 国产精品成人在线观看| 在线观看欧美成人| 亚洲免费一在线| 久久综合九色| 亚洲一区二区三区四区在线观看| 久久久国产视频91| 国产精品伦一区| 亚洲国产小视频在线观看| 午夜精品理论片| 亚洲人久久久| 久久精品视频99| 国产精品国产三级国产| 亚洲黄色有码视频| 久久精品国产第一区二区三区最新章节| 亚洲第一在线综合在线| 亚洲欧美日韩精品综合在线观看| 欧美精品一区二区高清在线观看| 国产一区二区黄色| 午夜精品一区二区三区四区| 亚洲人成久久| 欧美91精品|