gcc入門

來源:互聯網
上載者:User

標籤:

gcc入門1. 什麼是gcc

gcc的全稱是GUN Compiler Collection,它是一個能夠編譯多種語言的編譯器。最開始gcc是作為C語言的編譯器(GNU C Compiler),現在除了c語言,還支援C++、java、Pascal等語言。gcc支援多種硬體平台。

2. gcc的特點
  • gcc是一個可移植的編譯器,支援多種硬體平台。例如ARM、X86等等。
  • gcc不僅是個本地編譯器,它還能跨平台交叉編譯。所謂的本地編譯器,是指編譯出來的程式只能夠在本地環境進行運行。而gcc編譯出來的程式能夠在其他平台進行運行。例如嵌入式程式可在x86上編譯,然後在arm上運行。
  • gcc有多種語言前端,用於解析不同的語言。
  • gcc是按模組化設計的,可以加入新語言和新CPU架構的支援。
  • gcc是自由軟體。任何人都可以使用或更改這個軟體。
3. gcc編譯器的過程

gcc編譯器主要經過四個過程:

  • 預先處理(Pre-Processing)
  • 編譯 (Compiling)
  • 彙編 (Assembling)
  • 連結 (Linking)

預先處理實際上是將標頭檔、宏進行展開。編譯階段,gcc調用不同語言的編譯器,例如c語言調用編譯器ccl。gcc實際上是個工具鏈,在編譯器的過程中調用不同的工具。彙編階段,gcc調用彙編器進行彙編。連結過程會將程式所需要的目標檔案進行連結成可執行檔。彙編器產生的是可重定位的目標檔案,學過作業系統,我們知道,在來源程式中地址是從0開始的,這是一個相對位址,而程式真正在記憶體中運行時的地址肯定不是從0開始的,而且在編寫原始碼的時候也不能知道程式的絕對位址,所以重定位能夠將原始碼的代碼、變數等定位為記憶體具體地址。下面以一張圖來表示這個過程,注意過程中檔案的尾碼變化,編譯選項和這些尾碼有關。

這是GCC編譯的四個步驟。

4. gcc常用選項

來看一下gcc常用選項

選項名 作用
-o 產生目標(.i、.s、.o、可執行檔等)
-E 只運行C先行編譯器
-S 告訴編譯器產生組譯工具檔案後停止編譯,產生的組合語言檔案拓展名為.s
-c 通知gcc取消串連步驟,即編譯源碼,並在最後產生目標檔案
-Wall 使gcc對源檔案的代碼有問題的地方發出警告
-Idir 將dir目錄加入搜尋標頭檔的目錄路徑
-Ldir 將dir目錄加入搜尋庫的目錄路徑
-llib 串連lib庫
-g 在目標檔案中嵌入調試資訊,以便gdb之類的偵錯工具調試

現在我們有源檔案hello.c,下面是一些gcc的使用樣本:

gcc -E hello.c -o hello.i   對hello.c檔案進行預先處理,產生了hello.i 檔案gcc -S hello.i -o hello.s    對預先處理檔案進行編譯,產生了彙編檔案gcc -c hello.s -o hello.o  對彙編檔案進行編譯,產生了目標檔案gcc hello.o -o hello 對目標檔案進行連結,產生可執行檔gcc hello.c -o hello 直接編譯連結成可執行目標檔案gcc -c hello.c 或 gcc -c hello.c -o hello.o 編譯產生可重定位目標檔案

使用gcc時可以加上-Wall選項。下面這個例子如果不加上-Wall選項,編譯器不會報出任何錯誤或警告,但是程式的結果卻不是預期的:

//bad.c#include<stdio.h>int main(){ printf("the number is %f ",5); //程式輸出了the number is 0.000000,結果錯誤 return 0; }

使用-Wall選項:

gcc -Wall bad.c -o bad

gcc將輸出警告資訊:

warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
printf("the number is %f\n",5);

5. gcc編譯多個檔案

假設現在有三個檔案:hello.c hello.h main.c ,三個檔案的內容如下:

// hello.c#include<stdio.h>#include"hello.h"void printHello(){ printf("hello world!\n");}
//main.c#include<stdio.h>#include"hello.h"int main(){ printHello(); return 0;}
//hello.h//僅包含函式宣告#ifndef _HELLO_#define _HELLO_void printHello();#endif

編譯這三個檔案,可以一次編譯:

gcc hello.c main.c -o main 產生可執行檔main

也可以獨立編譯:

gcc -Wall -c main.c -o main.o
gcc -Wall -c hello.c -o hello.o
gcc -Wall main.o hello.o -o main

獨立編譯的好處是,當其中某個模組發送改變時,只需要編譯該模組就行,不必重新編譯所有檔案,這樣可以節省編譯時間。

6. 使用外部庫

在使用C語言和其他語言進行程式設計的時候,我們需要標頭檔來提供對常數的定義和對系統及庫函數調用的聲明。庫檔案是一些預先編譯好的函數集合,那些函數都是按照可重用原則編寫的。它們通常由一組互相關聯的可重用原則編寫的,它們通常由一組互相關聯的用來完成某項常見工作的函數構成。使用庫的優點在於:

  • 模組化的開發
  • 可重用性
  • 可維護性

庫又可以分為靜態庫與動態庫:

  • 靜態庫(.a):程式在編譯連結的時候把庫的代碼連結到可執行檔中。程式啟動並執行時候將不再需要靜態庫。靜態庫比較佔用磁碟空間,而且程式不可以共用靜態庫。運行時也是比較占記憶體的,因為每個程式都包含了一份靜態庫。

  • 動態庫(.so或.sa):程式在啟動並執行時候才去連結共用庫的代碼,多個程式共用使用庫的代碼,這樣就減少了程式的體積。

一般標頭檔或庫檔案的位置在:

  • /usr/include及其子目錄底下的include檔案夾
  • /usr/local/include及其子目錄底下的include檔案夾
  • /usr/lib
  • /usr/local/lib
  • /lib
7. 產生靜態庫

為了產生.a檔案,我們需要先產生.o檔案。下面這行命令將我們的hello.o打包成靜態庫libhello.a:

ar rcs libhello.a hello.o

ar是gun歸檔工具,rcs表示replace and create,如果libhello之前存在,將建立新的libhello.a並將其替換。

然後就可以這樣來使用靜態庫libhello.a

gcc -Wall main.c libhello.a -o main

還有另外一種使用方式:

gcc -Wall -L. main.c -o main -lhello 【lhello 是 libhello的縮寫】

其中 -L.表示庫檔案的位置在目前的目錄下,由於libhello.a是我們自己產生的,並存放在當前錄下下,所以需要加上-L.選項。預設庫檔案是在系統的目錄下進行搜尋。同樣的,-I.選項用於標頭檔的搜尋。

8. 產生共用庫

產生一個共用庫,名稱的規則是libxxx.so。將剛才hello.o產生libhello.so的命令為:

gcc -shared -fPIC hello.o -o libhello.so

產生了共用庫之後,可以這樣來使用共用庫:

gcc -Wall main.o -o main -L. -lhello

該命令與使用靜態庫的命令相同,但是在共用庫與靜態庫共存的情況下,優先使用共用庫。

共用庫有時候並不不在當前的目錄下,為了讓gcc能夠找得到共用庫,有下面幾種方法:

  1. 拷貝.so檔案到系統共用庫路徑下,一般指/usr/lib
  2. 在~/.bash_profile檔案中,配置LD_LIBRARY_PATH變數
  3. 配置/etc/ld.so.conf,配置完成後調用ldconfig更新ld.so.cache

其中,shared選項表示產生共用庫格式。fPIC表示產生位置無關碼(position independent code),位置無關碼錶示它的運行、載入與記憶體位置無關,可以在任何記憶體位址進行載入。

9. 庫的搜尋路徑

庫的搜尋路徑遵循幾個搜尋原則:從左至右搜尋-I -l指定的目錄,如果在這些目錄中找不到,那麼gcc會從由環境 變數指定的目錄進行尋找。標頭檔的環境變數是C_INCLUDE_PATH,庫的環境變數是LIBRARY_PATH.如果還是找不到,那麼會從系統指定指定的目錄進行搜尋。

文章連結:http://www.cnblogs.com/QG-whz/p/5456720.html

 分類: Linux開發工具

gcc入門

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.