国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

在Linux操作系統下共享庫編程的方法介紹

2024-08-27 23:57:42
字體:
來源:轉載
供稿:網友

一、說明

類似Windows系統中的動態鏈接庫,Linux中也有相應的共享庫用以支持代碼的復用。Windows中為*.dll,而Linux中為*.so。下面詳細介紹如何創建、使用Linux的共享庫。

二、創建共享庫

在mytestso.c文件中,代碼如下:

#include <stdio.h>#include <stdlib.h>int GetMax(int a, int b){  if (a >= b)       return a;   return b;}int GetInt(char* psztxt){     if (0 == psztxt)            return -1;     return atoi(psztxt);}

然后使用下列命令進行編譯:

gcc -fpic -shared mytestso.c -o mytestso.so

-fpic 使輸出的對象模塊是按照可重定位地址方式生成的

編譯成功后,當前目錄下有mytestso.so,此時已成功創建共享庫mytestso.so。

三、使用共享庫

共享庫中的函數可被主程序加載并執行,但是不必編譯時鏈接到主程序的目標文件中。主程序使用共享庫中的函數時,需要事先知道所包含的函數的名稱(字符串),然后根據其名稱獲得該函數的起始地址(函數指針),然后即可使用該函數指針使用該函數。

在mytest.c文件中,代碼如下:

  1. #include <dlfcn.h>#include <stdio.h>int main(int argc, char* argv[]){    void* pdlhandle;    char* pszerror;        int (*GetMax)(int a, int b);    int (*GetInt)(char* psztxt);        int a, b;    char* psztxt = "1024";        // open mytestso.so    pdlhandle = dlopen("./mytestso.so", RTLD_LAZY);    pszerror = dlerror();    if (0 != pszerror) {        printf("%s", pszerror);        exit(1);    }        // get GetMax func    GetMax = dlsym(pdlhandle, "GetMax");    pszerror = dlerror();    if (0 != pszerror) {        printf("%s", pszerror);        exit(1);    }        // get GetInt func    GetInt = dlsym(pdlhandle, "GetInt");    pszerror = dlerror();    if (0 != pszerror) {        printf("%s", pszerror);        exit(1);    }        // call fun    a = 200;    b = 600;    printf("max=%d", GetMax(a, b));    printf("txt=%d", 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系統使用共享庫的編程問題,并通過一個簡單的實例詳細說明。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 秦安县| 桂阳县| 方山县| 南康市| 驻马店市| 同仁县| 岳阳市| 柳林县| 红河县| 宜丰县| 太和县| 大足县| 米易县| 夏邑县| 拜城县| 丹东市| 江源县| 沿河| 边坝县| 昌乐县| 高雄县| 兰考县| 赞皇县| 湘阴县| 宜州市| 东港市| 上思县| 嘉黎县| 罗定市| 文化| 沂水县| 通江县| 平原县| 田林县| 昔阳县| 平和县| 襄垣县| 平邑县| 安平县| 双桥区| 宁武县|