日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux平台 使用dlopen接口调用HelloWorld动态库简单实例

發(fā)布時(shí)間:2025/4/5 linux 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux平台 使用dlopen接口调用HelloWorld动态库简单实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

動(dòng)態(tài)庫(kù)(libxxx.so)一種調(diào)用方式是在編譯的時(shí)候的時(shí)候指定庫(kù)名 -lxxx,另一種調(diào)用方式是通過(guò)dlopen在程序里加載動(dòng)態(tài)庫(kù),然后調(diào)用相關(guān)接口。相關(guān)接口比較簡(jiǎn)單,包括打開動(dòng)態(tài)庫(kù),解析庫(kù)里提供的symbol(函數(shù)或者變量),關(guān)閉動(dòng)態(tài)庫(kù)引用計(jì)數(shù)。

編譯的時(shí)候加上-ldl(指定dl庫(kù)) 頭文件 #include <dlfcn.h> /*** 加載指定的動(dòng)態(tài)庫(kù)并返回動(dòng)態(tài)庫(kù)的句柄。如果參數(shù)filename為NULL* 則返回的句柄就是main program.如果加載的庫(kù)又依賴其它的動(dòng)態(tài)庫(kù)* 則這些庫(kù)會(huì)自動(dòng)被鏈接器加載。* flags有如下選項(xiàng),可以O(shè)Red方式選擇多個(gè)* RTLD_LAZY : 在dlopen返回前,對(duì)于動(dòng)態(tài)庫(kù)中的未定義的符號(hào)不執(zhí)行解析(只對(duì)函數(shù)引用有效,對(duì)于變量引用總是立即解析)。* RTLD_NOW : 需要在dlopen返回前,解析出所有未定義符號(hào),如果解析不出來(lái),在dlopen會(huì)返回NULL,錯(cuò)誤為:: undefined symbol: xxxx.......* RTLD_GLOBAL:動(dòng)態(tài)庫(kù)中定義的符號(hào)可被其后打開的其它庫(kù)解析。* RTLD_LOCAL:動(dòng)態(tài)庫(kù)中定義的符號(hào)可被其后打開的其它庫(kù)解析。* 成功返回非NULL句柄,失敗返回NULL;*/ void *dlopen(const char *filename, int flags);/*** 減少共享庫(kù)句柄的引用計(jì)數(shù),如果系統(tǒng)中沒有其它引用的地方,則卸載該庫(kù)。* 成功返回0,失敗返回非零值。*/ int dlclose(void *handle);/*** 從dlopen返回的句柄中查找指定的符號(hào)并返回地址,* 成功返回該符號(hào)地址,失敗返回NULL。*/ void *dlsym(void *handle, const char *symbol);

libHelloWorld.so實(shí)現(xiàn)代碼:

//實(shí)現(xiàn)文件 HelloWorld.c /*** 簡(jiǎn)單動(dòng)態(tài)庫(kù)文件使用*/ #include "HelloWorld.h"void hello(void) {printf("Hello World \r\n");return ; }//頭文件 HelloWorld.h #include <stdio.h>void hello(void);

dlopen測(cè)試程序:

/*** linux平臺(tái) dlopen接口調(diào)用動(dòng)態(tài)庫(kù)簡(jiǎn)單例子*/ #include <dlfcn.h> #include <stdlib.h> #include <stdio.h>void main() {void *handle;void (*hello)(void);/* 加載libHelloWorld.so */handle = dlopen("libHelloWorld.so", RTLD_LAZY);if (!handle) {printf("open libHelloWorld.so fail\r\n");return;}/* 引用庫(kù)提供的symbol,可以是變量也可以是函數(shù) */hello = dlsym(handle, "hello");if ( !hello ){printf("open symbol fail\r\n");dlclose(handle);return;}/* 調(diào)用庫(kù)函數(shù) */hello();/* 釋放庫(kù)的引用計(jì)數(shù) */dlclose(handle);return; }

Makefile:

# # Linux dlopen接口調(diào)用動(dòng)態(tài)庫(kù)簡(jiǎn)單例子 ## -shared 指定生成動(dòng)態(tài)鏈接庫(kù) # -fPIC :表示編譯為位置獨(dú)立的代碼,用于編譯共享庫(kù) dynlib:gcc -shared -fPIC -o libHelloWorld.so HelloWorld.ccp -rf libHelloWorld.so /usr/lib/#使用dlopen接口需要在編譯的時(shí)候加上-ldl選項(xiàng) dllib:gcc -o dllib dl_call_lib.c -ldlclean:rm -rf *.o *.so demoapp

測(cè)試截圖:

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的linux平台 使用dlopen接口调用HelloWorld动态库简单实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。