Linux系統共享庫程式設計

2021-04-27 10:58:03 字數 1683 閱讀 7117

一、說明

類似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...