1. 程式人生 > >1.GCC程序編譯

1.GCC程序編譯

多個 推出 wal linux系統 鏈接 編程 節省空間 尋找 例如

  Linux系統下的gcc(GNU C Compiler)是GNU推出的功能強大,性能優越的多平臺編譯器,是GNU的代表作之一。gcc可以在多個硬件平臺上編譯出可執行的程序,其執行效率與一般的編譯器相比,效率要高20%~30%。

  GCC編譯器能將C,C++語言源程序,匯編程序編譯,鏈接成可以執行文件,在Linux系統中,可執行文件沒有統一的後綴,系統從文件的屬性來區分可執行文件和不可執行文件。使用GCC編譯程序時,編譯過程可以被細分為四個階段:

  (1)預編譯(Pre-Processing)

  (2)編譯(Compiling)

  (3)匯編(Assembling)

  (4)鏈接(Linking)

GCC通過後綴來區分輸入文件的類別:

  .c為後綴的文件:C語言源代碼文件

  .a為後綴的文件:由目標文件構成的庫文件

  .C , .cc或.cxx為後綴的文件:是C++源代碼文件

  .h為後綴的文件:頭文件

  .i為後綴的文件:是已經預處理過的C源代碼文件

  .ii為後綴的文件:是已經預處理過的C++源代碼文件

  .o為後綴的文件:是編譯後的目標文件

  .s為後綴的文件:是匯編語言源代碼文件

  .S為後綴的文件:是經過預編譯的匯編語言源代碼文件

gcc的基本用法是:gcc [options][filenames]

  options:編譯器所需要的編譯選項

  filenames:要編譯的文件名

簡單的程序演示:

  技術分享

編譯和運行這段程序:

  技術分享

gcc編譯選項(option)大約有100多個,其中多數我們不會用到,這裏只是介紹其中最基本,最常用的參數。

(1)-o output_filename: 確定可執行文件的名稱為output_filename。如果不給出這個選項,gcc就給出預設的可執行文件a.out。

(2)-c:只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件。

  技術分享

(3)-g:產生調試工具(GNU的gdb)所必要的符號信息,要想對編譯出的程序進行調試,就必須加入這個選項。

(4)-O:對程序進行優化編譯,鏈接,采用這個選項整個源代碼會在編譯鏈接過程中優化處理,這樣產生的可執行文件的執行效率會提高,但是編譯鏈接的速度就相應的慢些。

  技術分享

  

  同一個程序,上面沒有優化,下面優化過,編譯時間差別很大

(5)-O2:比-O更好的優化編譯鏈接,編譯鏈接過程會更慢

(6)-Idirname:將dirname所指出的目錄加入到程序頭文件目錄列表中。例如:gcc –I/home/part hello.c

  C程序中的頭文件包含兩種情況:

    1. #include <A.h>

    2.#include “B.h”

  對於<>, 預處理程序cpp在系統預設的頭文件目錄(如/usr/include)中搜尋相應的文件,而對於””,cpp在當前目錄中搜尋文件。這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。

(7)-Ldirname: 將dirname所指出的目錄加入到庫文件的目錄列表中,在默認狀態下,連接程序Id在系統的預設路徑中(如/usr/lib)尋找所需要的庫文件,這個選項告訴連接程序,首先到-L指定的目錄中去尋找,然後再到系統預設路徑中尋找。

(8)-lname: 在連接時,裝載名字為”libname.a”的函數庫,該函數庫位於系統預設的目錄或者由-L選項確定的目錄下。例如,-lm表示連接名為”libm.a”的數學函數庫。

  例: gcc foo.c -L /home/lib -lfoo -o foo

(9)-static: 靜態鏈接庫文件,例:gcc –static hello.c –o hello

  庫有動態與靜態兩種,動態通常用.so為後綴,靜態通常用.a為後綴。例如:libhello.so libhello.a 。當使用靜態庫時,連接器找出程序所需的函數,然後將它們拷貝到可執行文件,一旦連接成功,靜態程序庫也就不再需要了。然而對於動態庫而言,就不是這樣,動態庫會在執行程序內留下一個標記,指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的缺省操作是首先連接動態庫。

(10)-Wall: 生成所有的警告信息

(11)-w: 不生成任何警告信息

(12)-DMACRO: 定義MACRO宏,等效於在程序中使用#define MACRO

1.GCC程序編譯