日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有关GNU GCC的基本内容整理

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有关GNU GCC的基本内容整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、GCC簡介

??? GCC(GNU Compiler Collection,GNU編譯器集合)是一套由GNU工程開發的支持多種編程語言的編譯器。GCC是自由軟件發展過程中的著名例子,由自由軟件基金會 以GPL協議發布。當年Richard Stallman 剛開始寫作 GCC 的時候,還只是把它當作僅僅一個 C 程序語言的編譯器,GCC 的意思也只是 GNU C Compiler 而已。現如今GCC經過自由軟件發展,已然成為GNU Compiler Collection,GNU編譯器集合,除了支持C語言外,還支持多種其他語言,例如C++、Ada、Java、Objective-C、 FORTRAN、Pascal等。現在通常所說的GCC是GUN Compiler Collection的簡稱。
??? GCC是大多數類Unix操作系統(如Linux、BSD、Mac OS X等)的標準的編譯器,同時,在Linux平臺下的嵌入式開發領域,GCC也是用得最普遍的一種編譯器。GCC之所以被廣泛采用,是因為它能支持各種不同 的目標體系結構。例如,它既支持基于宿主的開發(簡單講就是要為某平臺編譯程序,就在該平臺上編譯),也支持交叉編譯(即在A平臺上編譯的程序是供平臺B 使用的)。目前,GCC支持的體系結構有四十余種,常見的有X86系列、Arm、PowerPC等。同時,GCC還能運行在不同的操作系統上,如 Linux、Solaris、Windows等。



二、程序的編譯過程

對于GUN編譯器來說,程序的編譯要經歷預處理、編譯、匯編、鏈接四個階段,如下圖所示:

?????

從功能上分,預處理、編譯、匯編是三個不同的階段,但GCC的實際操作上,它可以把這三個步驟合并為一個步驟來執行。下面我們以C語言為例來談一下不同階段的輸入和輸出情況。

在預處理階段,輸入的是C語言的源文件,通常為*.c。它們通常帶有.h之類頭文件的包含文件。這個階段主要處理完成源文件中的諸如#ifdef、 #include和#define的編譯與處理指令。該階段會生成一個中間文件*.i,但實際工作中通常不用專門生成這種文件,因為基本上用不到;若非要 生成這種文件不可,可以利用下面的示例命令:

gcc -E? test.c -o test.i

在編譯階段,輸入的是中間文件*.i,編譯后生成匯編語言文件*.s 。這個階段對應的GCC命令如下所示:

GCC -S test.i -o test.s

在匯編階段,將輸入的匯編文件*.s轉換成機器語言*.o。這個階段對應的GCC命令如下所示:

GCC -c test.s -o test.o

最后,在鏈接階段將輸入的機器代碼文件*.s(與其它的機器代碼文件和庫文件)匯集成一個可執行的機器代碼文件。這一步驟,可以利用下面的示例命令完成:

GCC test.o -o test

上面介紹了GCC編譯過程的四個階段以及相應的命令。

????? 總結:gcc命令。gcc命令加選項-o可以指定其輸出文件名稱;加選項-c則不進入鏈接環節,輸出機器碼目標程序;加選項-S則不進入匯編環節,輸出匯編碼的目標程序;加選項-E則不進入編譯環節,輸出完成預處理指令處理后的結果。


?


三、編譯器GCC的基本功能及其使用介紹

下面以一個例子來說明。為簡單起見,假設我們全部的源代碼都在一個文件test.c中,要想把這個源文件直接編譯成可執行程序,可以使用以下命令:

?

$ GCC -o test

這里test.c是源文件,生成的可執行代碼存放在一個名為test 的文件中(該文件是機器代碼并且可執行)。-o 是生成可執行文件的輸出選項。

如果我們只想讓源文件生成機器碼目標文件(該文件雖然也是機器代碼但因未經鏈接成可執行文件,所以該文件并不可執行),可以使用gcc命令選項-c ,詳細命令如下所示:

$ GCC -c test.c

默認情況下,生成的目標文件被命名為test.o,但我們也可以為輸出文件指定名稱,如下所示:

$ GCC -c test.c -o mytest.o

上面這條命令將編譯后的機器碼目標文件命名為mytest.o,而不是默認的test.o。


?

到此為止,我們談論的程序僅涉及到一個源文件;現實中,一個程序的源代碼通常包含在多個源文件之中,這該怎么辦?沒關系,即使這樣,用GCC處理起來也并不復雜,見下例:

$ GCC -o test? first.c second.c third.c

該命令將同時編譯三個源文件,即first.c、second.c和 third.c,然后將它們連接成一個可執行程序,名為test。


??????? 許多情況下,我們的頭文件和源文件會單獨存放在不同的目錄中。另一方面,在開發軟件時,除了標準庫文件外,我們完全不使用第三方函數庫的情況是比較少見 的,通常來講都需要借助許多函數庫的支持才能夠完成相應的功能。從程序員的角度看,函數庫實際上就是一些頭文件(.h)和庫文件(so、或lib、 dll)的集合。雖然Linux下的大多數函數都默認將頭文件放到/usr/include/目錄下,而庫文件則放到/usr/lib/目錄 下;Windows所使用的庫文件主要放在Visual Stido的目錄下的include和lib,以及系統文件夾下。但也有的時候,我們要用的庫或許就是不在這些目錄下,所以GCC在編譯時必須用自己的辦 法來查找所需要的頭文件和庫文件,GCC命令的-I選項(特別注意:這是字母i的大寫)可以添加頭文件搜索目錄,-L加-l選項(注意:這是字母L的大小 寫,而不是字符i)可以添加庫文件搜索目錄。

  例如,假設存放源文件的子目錄名為./src,而包含文件則放在層次的其他目錄下,如./inc。當我們在./src 目錄下進行編譯工作時,如何告訴GCC到哪里找頭文件呢?方法如下所示:

$ gcc test.c –I../inc -o test

上面的命令告訴GCC包含文件存放在../inc 目錄下。如果在編譯時需要的包含文件存放在多個目錄下,可以使用多個-I 來指定各個目錄:

$ gcc test.c –I../inc –I../../inc2 -o test

這里指出了另一個包含子目錄inc2,較之前目錄它還要在再上兩級才能找到。

?

四、警告功能

當GCC在編譯過程中檢查出錯誤的話,它就會中止編譯;但檢測到警告時卻能繼續編譯生成可執行程序,因為警告只是針對程序結構的診斷信息,它不能說 明程序一定有錯誤,而是存在風險,或者可能存在錯誤。雖然GCC提供了非常豐富的警告,但前提是你已經啟用了它們,否則它不會報告這些檢測到的警告。

在眾多的警告選項之中,最常用的就是-Wall選項。該選項能發現程序中一系列的常見錯誤警告,該選項用法舉例如下:

$ gcc -Wall test.c -o test

該選項相當于同時使用了下列所有的選項:

◆unused-function:遇到僅聲明過但尚未定義的靜態函數時發出警告。
◆unused-label:遇到聲明過但不使用的標號的警告。
◆unused-parameter:從未用過的函數參數的警告。
◆unused-variable:在本地聲明但從未用過的變量的警告。
◆unused-value:僅計算但從未用過的值得警告。
◆Format:檢查對printf和scanf等函數的調用,確認各個參數類型和格式串中的一致。
◆implicit-int:警告沒有規定類型的聲明。
◆implicit-function-:在函數在未經聲明就使用時給予警告。
◆char-subscripts:警告把char類型作為數組下標。這是常見錯誤,程序員經常忘記在某些機器上char有符號。
◆missing-braces:聚合初始化兩邊缺少大括號。
◆Parentheses:在某些情況下如果忽略了括號,編譯器就發出警告。
◆return-type:如果函數定義了返回類型,而默認類型是int型,編譯器就發出警告。同時警告那些不帶返回值的 return語句,如果他們所屬的函數并非void類型。
◆sequence-point:出現可疑的代碼元素時,發出報警。
◆Switch:如果某條switch語句的參數屬于枚舉類型,但是沒有對應的case語句使用枚舉元素,編譯器就發出警告(在switch語句中使用default分支能夠防止這個警告)。超出枚舉范圍的case語句同樣會導致這個警告。
◆strict-aliasing:對變量別名進行最嚴格的檢查。
◆unknown-pragmas:使用了不允許的#pragma。
◆Uninitialized:在初始化之前就使用自動變量。

需要注意的是,各警告選項既然能使之生效,當然也能使之關閉。比如假設我們想要使用-Wall來啟用個選項,同時又要關閉unused警告,利益通過下面的命令來達到目的:

$ gcc -Wall -Wno-unused test.c -o test

下面是使用-Wall選項的時候沒有生效的一些警告項:

◆cast-align:一旦某個指針類型強制轉換時,會導致目標所需的地址對齊邊界擴展,編譯器就發出警告。例如,某些機器上只能在2或4字節邊界上訪問整數,如果在這種機型上把char *強制轉換成int *類型, 編譯器就發出警告。
◆sign-compare:將有符號類型和無符號類型數據進行比較時發出警告。
◆missing-prototypes :如果沒有預先聲明函數原形就定義了全局函數,編譯器就發出警告。即使函數定義自身提供了函數原形也會產生這個警告。這樣做的目的是檢查沒有在頭文件中聲明的全局函數。
◆Packed:當結構體帶有packed屬性但實際并沒有出現緊縮式給出警告。
◆Padded:如果結構體通過充填進行對齊則給出警告。
◆unreachable-code:如果發現從未執行的代碼時給出警告。
◆Inline:如果某函數不能內嵌(inline),無論是聲明為inline或者是指定了-finline-functions 選項,編譯器都將發出警告。
◆disabled-optimization:當需要太長時間或過多資源而導致不能完成某項優化時給出警告。

上面是使用-Wall選項時沒有生效,但又比較常用的一些警告選項。本文中要介紹的最后一個常用警告選項是-Werror。使用該選項后,GCC發現可疑之處時不會簡單的發出警告就算完事,而是將警告作為一個錯誤而中斷編譯過程。該選項在希望得到高質量代碼時非常有用。




以上整理參考了51CTO網站上有關GCC使用入門的文章,原文參見http://developer.51cto.com/art/200609/32317.htm

轉載于:https://www.cnblogs.com/libig/p/4100908.html

總結

以上是生活随笔為你收集整理的有关GNU GCC的基本内容整理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。