下面以工程libtest為例說明gcc建立和使用靜態庫、動態庫的過程,libtest目錄結構和內容如圖1所示,其中三個檔案hello.h,hello.c和main.c的內容如下。
圖1libtest/include/hello.h
#ifdef _hello_h_
#define _hello_h_
void hello();
#endif
libtest/lib/hello.c
#include "hello.h"
#include void hello()
libtest/src/main.c
#include "hello.h"
int main()
(1) 進入libtest/lib目錄,執行命令:
gcc -c -i../include hello.c
該命令生成目標檔案hello.o,注意:引數-i新增標頭檔案搜尋目錄,這裡因為hello.c中有#include 「hello.h」,hello.h在libtest/include目錄中,這裡需要指定該目錄通知gcc,否則出現錯誤提示「找不到標頭檔案hello.h」。
這一步將在libtest/lib目錄中生成乙個hello.o檔案。
(2) 在libtest/lib目錄,執行命令:
ar rc libhello.ahello.o
該命令將hello.o新增到靜態庫檔案libhello.a,ar命令就是用來建立、修改庫的,也可以從庫中提出單個模組,引數r表示在庫中插入或者替換模組,c表示建立乙個庫,關於ar命令的詳細使用規則可以參考文章
這一步將在libtest/lib目錄中生成乙個libhello.a檔案。
(3) 進入libtest/src目錄,執行命令:
gcc main.c-i../include -l../lib -lhello -o main
該命令將編譯main.c並鏈結靜態庫檔案libhello.a生成可執行檔案main,注意:引數-l新增庫檔案搜尋目錄,因為libhello.a在libtest/lib目錄中,這裡需要指定該目錄通知gcc,引數-l指定鏈結的庫檔名稱,名稱不用寫全名libhello.a,只用寫hello即可。
這一步將在libtest/src目錄中生成可執行檔案main。
(1) 進入libtest/lib目錄,執行命令:
gcc hello.c-i../include -fpic -shared -o libhello.so
這一步將在當前目錄生成動態庫檔案libhello.so,引數-fpic -shared固定格式,不用糾結他們什麼意思。
(2) 進入libtest/src目錄,執行命令:
gcc main.c-i../include -l../lib -lhello -o main
此時在當前目錄中已經生成了可執行檔案main,執行./main時卻提示錯誤:
./main: error while loading shared libraries: libhello.so: cannotopen shared object file: no such file or directory
也就是找不到動態庫檔案libhello.so,在網上找了答案說如果遇到這樣的問題需要設定環境變數ld_library_path,如下:
export ld_library_path=」../lib」
gcc main.c -i../include -l../lib -lhello -o main
然後再執行./main就沒有錯誤了。
【補充】
環境變數ld_library_path指示動態聯結器可以裝載動態庫的路徑,在鏈結動態庫檔案前設定該變數為庫檔案所在路徑,注意:用export ld_library_path=」…」方式只是臨時生效的,如果要永久有效可以寫入~/.bashrc檔案中,跟修改path類似,exportld_library_path=$ld_library_path:」…」。
當然如果有root許可權的話,也可以修改/etc/ld.so.conf檔案,將要新增的動態庫搜尋路徑寫入該檔案中,然後呼叫/sbin/ldconfig來達到同樣的目的。
本部落格還有另外一篇文章可參考:
gcc建立和使用靜態庫 動態庫
gcc建立和使用靜態庫 動態庫 下面以工程libtest為例說明gcc 建立和使用 靜態庫 動態庫的過程,libtest目錄結構和內容如圖1所示,其中三個檔案hello.h,hello.c和main.c的內容如下。libtest include hello.h ifdef hello h defin...
靜態庫與動態庫的建立和使用
一 靜態庫的建立 1 gcc c 原始檔.c 產生.o檔案 ar rcs rcd 靜態庫名 libname.a 目標檔案1 目標檔案2 二 靜態庫的使用 2 gcc o file file.c l.lname ar t libname.a 列出庫中的目標檔案 ar d libname.a file....
靜態庫和動態庫的建立和使用
靜態庫 靜態庫是在程式執行之前就編譯到目標程式去了 優點 執行快 缺點 占用空間大 靜態庫的建立 生成xx.a檔案 1.gcc cal.c c 函式檔案 生成 o檔案 2.ar rcs libcalcul.a 需要生成的.a檔案 cal.o 一般用lib開頭,便於砍頭去尾 3.gcc calcula...