【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
動態連結程式庫不是linux專屬的特性,在windows下面也存在這樣的特性。一般來說,windows下面的動態串連庫是以*.dll作為結尾的,而linux下面的動態串連庫是以*.so結尾的。和靜態連結庫相比,動態串連庫可以共用記憶體資源,這樣可以減少記憶體消耗。另外,動態串連是需要經過作業系統載入器的協助才能被普通執行檔案發現的,所以動態串連庫可以減少連結的次數。有了這個特點,我們就不難發現為什麼很多軟體的補丁其實都是以動態庫發布的。
那麼,在Linux上動態庫是怎麼產生的呢?
#include "test.h"int add(int a, int b){ return a + b;}
標頭檔格式,
#ifndef _TEST_H#define _TEST_Hint add(int a, int b);#endif
此時如果我們想要產生動態庫,要做的工作其實非常簡單,輸入gcc -shared -fPIC -o libtest.so test.c即可。斷行符號後輸入ls,我們就可以發現目前的目錄下面出現了libtest.so檔案。
#include <stdio.h>#include "test.h"int main(){ printf("%d\n", add(2, 3)); return 1;}
在上面的代碼當中,我們發現使用到了add函數,那麼此時如何才能產生一個執行檔案呢?也很簡單,輸入gcc hello.c -o hello ./libtest.so。然後輸入./hello,此時可以驗證一下執行檔案運行是否正確。在編寫靜態庫的時候,我說過靜態庫是彙編連結到執行檔案當中的,而動態庫不會。朋友們可以做個小實驗,刪除libtest.so,然後輸入./hello。此時大家可以看看系統有沒有錯誤返回?
這個時候,有的朋友就會問了,那在windows下面dll應該怎麼編寫呢?其實也不難,只要在test.h上面稍作改變即可。其他的步驟和靜態庫的操作是基本類似的。
#ifndef _TEST_H#define _TEST_H#ifdef USR_DLL#define DLL_API _declspec(dllexport)#else#define DLL_API _declspec(dllimport)#endifDLL_API int add(int a, int b);#endif