gcc的基本用法


linux下gcc的基本用法

gcc 是 GUN Compiler Collection的縮寫,可以支持多種語言編譯,比如 C,C++,Java, pascal 等

gcc的編譯過程

  • 預處理(pre-processing)E:插入頭文件,替換宏
  • 編譯(Compiling)S:編譯成匯編
  • 匯編(Assembling) c:編譯成目標文件
  • 鏈接 (Linking):鏈接到庫中,變成可執行文件

gcc -E hello.c -o hello.i

gcc -S hello.i –o hello.s

gcc –c hello.s –o hello.o

gcc hello.s –o hello 鏈接,生成可執行文件

/hello 運行

也可以一次性完成:

gcc hello.c –o hello

但一般情況下生成.o文件比較好,可以重定位文件,讓別人使用

gcc常用選項

選項名 作用
o 生成目標
c 取消鏈接步驟,編譯源碼並最后生成目標文件
E 只運行C預編譯器(頭文件,宏等展開)
S 生成匯編語言文件后停止編譯(.s文件)
Wall 打開編譯告警(所有)
g 嵌入調試信息,方便gdb調試
llib 鏈接 lib 庫 (這里是小寫 L ) 相當於 C++ #pragma comment(lib, “xxx.lib”)
Idir 增加 include 目錄 (這里是大寫 i ) 頭文件路徑
LDir 增加 lib 目錄 (編譯靜態庫和動態庫)

多模塊編譯

  • 一次性編譯:

    gcc -Wall fun.c main_fun.c –o main_fun

  • 獨立編譯:

    gcc –Wall –c main_fun.c –o main_fun.o

    gcc –Wall –c fun.c –o fun.o

    gcc –Wall main_fun.o fun.o –o main_fun

多模塊編譯中如果某一個模塊發生了變化,只需要編譯更改的模塊即可

靜態庫與共享庫(動態庫)

靜態庫(.a)

程序在編譯鏈接時候把庫的代碼鏈接到可執行文件中。程序運行時候,不再需要靜態庫,生成的可執行文件大,每個可執行文件都會加載一份拷貝到內存

  • 靜態庫生成(libxxx.a)

    首先生成.o文件,然后通過.o文件生成.a文件

    例如:

    gcc –c fun.c

    ar rcs libfun.a fun.o

  • 靜態庫使用

    gcc –Wall main.c libfun.a –o main

    gcc –Wall –L. main.c –o main –lfun

    -L.表示在當前目錄搜索 libfun.a

  • 靜態庫搜索路徑

    1:編譯使用選項 –L 指定的目錄(建議)

    2:修改環境變量,搜索指定的目錄 設置環境變量 LIBRARY_PATH

    export LIBRARY_PATH=“庫目錄

    3:lib文件放入系統指定目錄,例如/usr/lib/等

共享庫(.so或.sa)

程序運行時候才去鏈接共享庫代碼,多個程序共享使用,使用時候只需要加載一份到內存

直接可以通過.c文件生成.so文件

例如:gcc –shared –fPIC fun.o –o libFun.so

shared:生成共享庫格式

fPIC: 產生位置無關碼,允許在任何地址加載 (否則只能從指定地址加載,無法控制)相對地址

使用: gcc –Wall main.o –o main –L. -lFun

只需要-l+文件名即可

配置方式

1:拷貝到so文件到共享庫目錄 /usr/lib/

2:更改 LD_LIBRARY_PATH,如果已經有了一個這樣的目錄,要寫成export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:“庫目錄”這樣子 如果寫在profile配置文件里 export LD_LIBRARY_PA TH="目錄:$LD_LIBRARY_PATH"

3:配置 /etc/ld.so.conf; 並使用 ldconfig 命令進行更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM