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 命令進行更新