linux平台 使用dlopen接口调用HelloWorld动态库简单实例
生活随笔
收集整理的這篇文章主要介紹了
linux平台 使用dlopen接口调用HelloWorld动态库简单实例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
動態(tài)庫(libxxx.so)一種調(diào)用方式是在編譯的時候的時候指定庫名 -lxxx,另一種調(diào)用方式是通過dlopen在程序里加載動態(tài)庫,然后調(diào)用相關(guān)接口。相關(guān)接口比較簡單,包括打開動態(tài)庫,解析庫里提供的symbol(函數(shù)或者變量),關(guān)閉動態(tài)庫引用計數(shù)。
編譯的時候加上-ldl(指定dl庫) 頭文件 #include <dlfcn.h> /*** 加載指定的動態(tài)庫并返回動態(tài)庫的句柄。如果參數(shù)filename為NULL* 則返回的句柄就是main program.如果加載的庫又依賴其它的動態(tài)庫* 則這些庫會自動被鏈接器加載。* flags有如下選項,可以O(shè)Red方式選擇多個* RTLD_LAZY : 在dlopen返回前,對于動態(tài)庫中的未定義的符號不執(zhí)行解析(只對函數(shù)引用有效,對于變量引用總是立即解析)。* RTLD_NOW : 需要在dlopen返回前,解析出所有未定義符號,如果解析不出來,在dlopen會返回NULL,錯誤為:: undefined symbol: xxxx.......* RTLD_GLOBAL:動態(tài)庫中定義的符號可被其后打開的其它庫解析。* RTLD_LOCAL:動態(tài)庫中定義的符號可被其后打開的其它庫解析。* 成功返回非NULL句柄,失敗返回NULL;*/ void *dlopen(const char *filename, int flags);/*** 減少共享庫句柄的引用計數(shù),如果系統(tǒng)中沒有其它引用的地方,則卸載該庫。* 成功返回0,失敗返回非零值。*/ int dlclose(void *handle);/*** 從dlopen返回的句柄中查找指定的符號并返回地址,* 成功返回該符號地址,失敗返回NULL。*/ void *dlsym(void *handle, const char *symbol);libHelloWorld.so實現(xiàn)代碼:
//實現(xiàn)文件 HelloWorld.c /*** 簡單動態(tài)庫文件使用*/ #include "HelloWorld.h"void hello(void) {printf("Hello World \r\n");return ; }//頭文件 HelloWorld.h #include <stdio.h>void hello(void);dlopen測試程序:
/*** linux平臺 dlopen接口調(diào)用動態(tài)庫簡單例子*/ #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;}/* 引用庫提供的symbol,可以是變量也可以是函數(shù) */hello = dlsym(handle, "hello");if ( !hello ){printf("open symbol fail\r\n");dlclose(handle);return;}/* 調(diào)用庫函數(shù) */hello();/* 釋放庫的引用計數(shù) */dlclose(handle);return; }Makefile:
# # Linux dlopen接口調(diào)用動態(tài)庫簡單例子 ## -shared 指定生成動態(tài)鏈接庫 # -fPIC :表示編譯為位置獨立的代碼,用于編譯共享庫 dynlib:gcc -shared -fPIC -o libHelloWorld.so HelloWorld.ccp -rf libHelloWorld.so /usr/lib/#使用dlopen接口需要在編譯的時候加上-ldl選項 dllib:gcc -o dllib dl_call_lib.c -ldlclean:rm -rf *.o *.so demoapp測試截圖:
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的linux平台 使用dlopen接口调用HelloWorld动态库简单实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux平台 一个简单的hellowo
- 下一篇: 固收类理财产品简单介绍 虽然收益不高但是