一、說明
類似windows系統中的動態鏈結庫,linux中也有相應的共享庫用以支援**的復用。windows中為*.dll,而linux中為*.so。下面詳細介紹如何建立、使用linux的共享庫。
二、建立共享庫
在mytestso.c檔案中,**如下:
#include #include int getmax(int a, int b)然後使用下列命令進行編譯:int getint(char* psztxt)
gcc -fpic -shared mytestso.c -o mytestso.so-fpic 使輸出的物件模組是按照可重定位位址方式生成的
編譯成功後,當前目錄下有mytestso.so,此時已成功建立共享庫mytestso.so。
三、使用共享庫
共享庫中的函式可被主程式載入並執行,但是不必編譯時鏈結到主程式的目標檔案中。主程式使用共享庫中的函式時,需要事先知道所包含的函式的名稱(字串),然後根據其名稱獲得該函式的起始位址(函式指標),然後即可使用該函式指標使用該函式。
在mytest.c檔案中,**如下:
#include #include int main(int argc, char* argv)然後使用如下命令進行編譯:// get getmax func
getmax = dlsym(pdlhandle, "getmax");
pszerror = dlerror();
if (0 != pszerror)
// get getint func
getint = dlsym(pdlhandle, "getint");
pszerror = dlerror();
if (0 != pszerror)
// call fun
a = 200;
b = 600;
printf("max=%d/n", getmax(a, b));
printf("txt=%d/n", getint(psztxt));
// close mytestso.so
dlclose(pdlhandle);
}
gcc mytest.c -ldl -o mytest-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系統使用共享庫的程式設計問題,並通過乙個簡單的例項詳細說明。
Linux系統共享庫程式設計
1 類似windows系統中的動態鏈結庫,linux中也有相應的共享庫用以支援 的復用。windows中為 dll,而linux中為 so。下 面詳細介紹如何建立 使用linux的共享庫。2 建立共享庫 sayhello.c include int sayhello void void saysom...
Ceph 檔案系統共享
塊共享相當於直接提供磁碟,這個磁碟是沒有格式化過的。檔案系統共享相當於提供格式化過的磁碟。檔案系統主要由兩部分組成 1 inode 記錄檔案的描述資訊,128位元組 2 block 用於儲存資料,4k 目前乙個ceph集群只能提供乙個檔案系統的共享。開始配置 1 新增一台新的主機 ip 192.16...
NFS網路檔案系統共享日誌
最近搞了個日誌收集 server,但是遇到了幾個問題 1 收集log的server上面有空間,卻不讓安裝ftp nginx及其他可提供訪問的服務 2 可提供服務的server又沒有磁碟空間 3 用什麼提供日誌訪問,ftp?nginx?還是其他共享?那這時候就想到了nfs網路檔案系統,在log ser...