最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中dlopen和dlsym的使用方式詳解

 更新時間:2022年03月27日 11:43:39   作者:s.feng  
這篇文章主要為大家詳細(xì)介紹了C語言中dlopen和dlsym的使用方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

背景

為了是不同的邏輯解耦,一般會把各個業(yè)務(wù)封裝成動態(tài)庫,然后主邏輯去調(diào)用各個插件。這里有個問題是,為什么以前我們都是通過include第三方的頭文件,然后通過連接器實(shí)現(xiàn),現(xiàn)在卻要利用dlopen呢?考慮以下情況,比如我們要用cublas這個庫的sgemm函數(shù)。

#include "cublas.h"
int main()
{
	cublas:: Mat a, b;
	cublas::sgemm(a,b);
}

我們知道cublas是英偉達(dá)提供的,人家每年都要更新動態(tài)庫的,比如今年更新后,動態(tài)庫的頭文件改了cublas_v2.h, 函數(shù)名改為sgemm_v2, 這樣一頓操作后,你不僅要升級庫,也要修改已經(jīng)上線的代碼,假如這個sgemm函數(shù)在你源碼中出現(xiàn)了n多次,這將是一個災(zāi)難。但是通過下面的方式你就可以避免這個問題:

// func.h
#include <stdio.h>
#include <stdlib.h>
#include <cublas_v2.h> // 如果你知道確切的函數(shù)返回信息,這個對應(yīng)下面的cublas_func可以自己寫。
#include <dlfcn.h>
extern std::once_flag cublas_dso_flag;
extern void *cublas_dso_handle;
  struct DynLoad__add {                                                
    template <typename... Args>                                             
    inline auto operator()(Args... args) -> DECLARE_TYPE(add, args...) 
    { 
      using cublas_func =  decltype(::add(std::declval<Args>()...)) (*)(Args...);         
      std::call_once(cublas_dso_flag, []() {                                
        cublas_dso_handle = dlopen("./libcublas.so", RTLD_LAZY);       
      });                                                                   
      static void *p_add = dlsym(cublas_dso_handle, "add");          
      return reinterpret_cast<cublas_func>(p_add)(args...);            
    }                                                                       
  };                                                                        
  extern DynLoad__add add;
// func.c
DynLoad__add add;
// main.cc
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
int main()
{
    add(2,7));
}
根據(jù)上面的代碼可以看到,只要你每次修改func.h文件的動態(tài)庫路勁和函數(shù)名就可以了,其他用到的add函數(shù)根本不需要再去修改。真是很方便,上面的代碼參考paddle的源碼:paddle/fluid/platform/dynload/cublas.h

demo

生產(chǎn)動態(tài)庫

int add(int a,int b)
{
    return (a + b);
}
int sub(int a, int b)
{
    return (a - b);
}

gcc -fPIC -shared caculate.c -o libcaculate.so

調(diào)用dlopen

#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);

dlopen是加載動態(tài)鏈接庫,flag可以設(shè)置不同的模式(RTLD_LAZY 暫緩決定,等有需要時再解出符號, RTLD_NOW 立即決定,返回前解除所有未決定的符號。), dlopen可以返回動態(tài)庫的句柄,dlsym是獲取動態(tài)庫中的具體函數(shù)名或者變量名。dlopen是關(guān)閉動態(tài)庫。

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
typedef int (*FUNC)(int, int);
int main()
{
    void *handle;
    char *error;
    FUNC func = NULL;
    //打開動態(tài)鏈接庫
    handle = dlopen("./libcaculate.so", RTLD_LAZY);
    //獲取一個函數(shù)
    *(void **) (&func) = dlsym(handle, "add");
    printf("add: %d\n", (*func)(2,7));
    //關(guān)閉動態(tài)鏈接庫
    dlclose(handle);
}

gcc -rdynamic -o main main.c -ldl

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!    

相關(guān)文章

  • C語言 array數(shù)組的用法詳解

    C語言 array數(shù)組的用法詳解

    數(shù)組是指一組數(shù)據(jù)的集合,(容器)數(shù)組中的每個數(shù)據(jù)稱為元素。在Java中,數(shù)組也是Java對象。數(shù)組中的元素可以是任意類型(包括基本類型和引用類),但同一個數(shù)組里只能存放類型相同的元素
    2021-10-10
  • C++指針與引用的區(qū)別案例詳解

    C++指針與引用的區(qū)別案例詳解

    這篇文章主要介紹了C++指針與引用的區(qū)別案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 深入二叉樹兩個結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解

    深入二叉樹兩個結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解

    本篇文章是對二叉樹兩個結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中的putchar函數(shù)示例

    C語言中的putchar函數(shù)示例

    putchar函數(shù)函數(shù)幾乎是在整個C語言中最沒有知名度的,它常常被程序員冷漠地對待,這篇文章主要介紹了C語言中的putchar函數(shù),需要的朋友可以參考下
    2022-12-12
  • 詳解DAG上的DP

    詳解DAG上的DP

    DAG:有向無環(huán)圖。DAG是學(xué)習(xí)動態(tài)規(guī)劃的基礎(chǔ),很多問題都可以直接轉(zhuǎn)化為DAG上的最長路、最短路或路徑計數(shù)問題。本文將詳細(xì)介紹DAG上的DP。
    2021-05-05
  • C語言可變參數(shù)與內(nèi)存管理超詳細(xì)講解

    C語言可變參數(shù)與內(nèi)存管理超詳細(xì)講解

    有時,您可能會碰到這樣的情況,您希望函數(shù)帶有可變數(shù)量的參數(shù),而不是預(yù)定義數(shù)量的參數(shù)。C 語言為這種情況提供了一個解決方案,這篇文章主要介紹了C語言可變參數(shù)與內(nèi)存管理
    2023-01-01
  • C++詳解如何實(shí)現(xiàn)動態(tài)數(shù)組

    C++詳解如何實(shí)現(xiàn)動態(tài)數(shù)組

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動態(tài)數(shù)組的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++中指針指向二維數(shù)組實(shí)例詳解

    C++中指針指向二維數(shù)組實(shí)例詳解

    這篇文章主要介紹了C++中指針指向二維數(shù)組實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++函數(shù)參數(shù)匹配規(guī)則示例小結(jié)

    C++函數(shù)參數(shù)匹配規(guī)則示例小結(jié)

    這篇文章主要介紹了C++函數(shù)參數(shù)匹配規(guī)則,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • C++實(shí)現(xiàn)廣度優(yōu)先搜索實(shí)例

    C++實(shí)現(xiàn)廣度優(yōu)先搜索實(shí)例

    這篇文章主要介紹了C++實(shí)現(xiàn)廣度優(yōu)先搜索,對于C++程序員來說非常有借鑒價值,需要的朋友可以參考下
    2014-08-08

最新評論

浠水县| 秭归县| 手机| 松溪县| 南郑县| 灌云县| 台州市| 沅陵县| 山阳县| 合水县| 平安县| 海宁市| 喀喇沁旗| 陇川县| 怀集县| 湄潭县| 连平县| 剑河县| 昭平县| 马山县| 方城县| 军事| 绵阳市| 岳阳县| 廉江市| 吴江市| 乌兰浩特市| 明星| 武城县| 巴彦县| 建水县| 西华县| 唐海县| 保德县| 玉龙| 甘孜县| 京山县| 根河市| 望江县| 岳阳市| 黑水县|