和windows系統一樣linux也有靜態/動態鏈結庫,下面介紹建立和使用方法:
假設有下面幾個檔案:
標頭檔案string.h,宣告相關函式原形,內容如下:
strlen.c:函式strlen的實現,獲取給定字串的長度,內容如下:
strlnen.c:函式strnlen的實現,獲取給定字串的長度,如果輸入字串的長度大於指定的最大長度,則返回最大長度,否者返回字串的實際長度,內容如下:
生成靜態庫:
利用gcc生成對應目標檔案:
gcc –c strlen.c strnlen.c
如果對應的檔案沒有錯誤,gcc會對檔案進行編譯生成strlen.o和strnlen.o兩個目標檔案(相當於windows下的obj檔案)。然後用ar建立乙個名字為libstr.a的庫檔案,並把strlen.o 和strnlen.o的內容插入到對應的庫檔案中。,相關命令如下:
ar –rc libstr.a strlen.o strnlen.o
命令執行成功以後,對應的靜態庫libstr.a已經成功生成。
生成動態鏈結庫:
gcc -fpic -shared -o libstr.so strlen.c strnlen.c
-fpic 使輸出的物件模組是按照可重定位位址方式生成的。
-shared指定把對應的原始檔生成對應的動態鏈結庫檔案libstr.so檔案。
對應的鏈結庫已經生成,下面看一下如何使用對應的鏈結庫。
靜態庫的使用:
假設有下面的檔案要使用對應的的靜態庫:
編譯生成對應的目標檔案:
gcc -c -i/home/hcj/******xx main.c
生成可執行檔案:
gcc -o main1 -l/home/hcj/******xx main.o libstr.a
其中-i/home/hcj/******xx和-l/home/hcj/******xx是通過-i和-l指定對應的標頭檔案和庫檔案的路徑。libstr.a是對應的靜態庫的名稱。這樣對應的靜態庫已經編譯到對應的可執行程式中。執行對應的可執行檔案便可以對應得函式呼叫的結果。
動態庫的分為隱式呼叫和顯式呼叫兩種呼叫方法:
隱式呼叫的使用使用方法和靜態庫的呼叫差不多,具體方法如下:
gcc -c -i/home/hcj/******xx main.c
gcc -o main1 -l/home/hcj/******xx main.o libstr.so //這裡是*.so
在這種呼叫方式中,需要維護動態鏈結庫的配置檔案/etc/ld.so.conf來讓動態鏈結庫為系統所使用,通常將動態鏈結庫所在目錄名追加到動態鏈結庫配置檔案中。否則在執行相關的可執行檔案的時候就會出現載入動態鏈結庫失敗的現象。在編譯所引用的動態庫時,可以在gcc採用 –l或-l選項或直接引用所需的動態鏈結庫方式進行編譯。在linux裡面,可以採用ldd命令來檢查程式依賴共享庫。
顯式呼叫:
gcc -o mian2 -ldl main2.c
用gcc編譯對應的原始檔生成可執行檔案,-ldl選項,表示生成的物件模組需要使用共享庫。執行對應得檔案同樣可以得到正確的結果。
相關函式的說明如下:
(1)dlopen()
第乙個引數:指定共享庫的名稱,將會在下面位置查詢指定的共享庫。
-環境變數ld_library_path列出的用分號間隔的所有目錄。
-檔案/etc/ld.so.cache中找到的庫的列表,用ldconfig維護。
-目錄usr/lib。
-目錄/lib。
-當前目錄。
第二個引數:指定如何開啟共享庫。
-rtld_now:將共享庫中的所有函式載入到記憶體
-rtld_lazy:會推後共享庫中的函式的載入操作,直到呼叫dlsym()時方載入某函式
(2)dlsym()
呼叫dlsym時,利用dlopen()返回的共享庫的phandle以及函式名稱作為引數,返回要載入函式的入口位址。
(3)dlerror()
該函式用於檢查呼叫共享庫的相關函式出現的錯誤。
這樣我們就用簡單的例子說明了在linux下靜態/動態庫的建立和使用。
建立靜態鏈結庫 動態鏈結庫
下面的實操中的動態庫或者靜態庫名都用wujunwu 第一步 建立乙個源 建立靜態鏈結庫的源 include void func1 void int func2 int x,int y 第二步 建立乙個.件作為函式宣告 void func1 void intfunc2 int x,int y 第三步 ...
動態鏈結庫 靜態鏈結庫
包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...
靜態鏈結庫 動態鏈結庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...