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

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

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

背景

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

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

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

// func.h
#include <stdio.h>
#include <stdlib.h>
#include <cublas_v2.h> // 如果你知道確切的函數返回信息,這個對應下面的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));
}
根據上面的代碼可以看到,只要你每次修改func.h文件的動態(tài)庫路勁和函數名就可以了,其他用到的add函數根本不需要再去修改。真是很方便,上面的代碼參考paddle的源碼:paddle/fluid/platform/dynload/cublas.h

demo

生產動態(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

調用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可以設置不同的模式(RTLD_LAZY 暫緩決定,等有需要時再解出符號, RTLD_NOW 立即決定,返回前解除所有未決定的符號。), dlopen可以返回動態(tài)庫的句柄,dlsym是獲取動態(tài)庫中的具體函數名或者變量名。dlopen是關閉動態(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);
    //獲取一個函數
    *(void **) (&func) = dlsym(handle, "add");
    printf("add: %d\n", (*func)(2,7));
    //關閉動態(tài)鏈接庫
    dlclose(handle);
}

gcc -rdynamic -o main main.c -ldl

總結

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

相關文章

  • C語言 array數組的用法詳解

    C語言 array數組的用法詳解

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

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

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

    深入二叉樹兩個結點的最低共同父結點的詳解

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

    C語言中的putchar函數示例

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

    詳解DAG上的DP

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

    C語言可變參數與內存管理超詳細講解

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

    C++詳解如何實現動態(tài)數組

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

    C++中指針指向二維數組實例詳解

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

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

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

    C++實現廣度優(yōu)先搜索實例

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

最新評論

教育| 甘泉县| 南雄市| 南木林县| 湖口县| 冕宁县| 汶上县| 牡丹江市| 观塘区| 铜鼓县| 古丈县| 沙雅县| 景宁| 宣威市| 页游| 灵台县| 镇赉县| 繁昌县| 大余县| 泌阳县| 台南县| 涞水县| 双城市| 上犹县| 乌兰浩特市| 鞍山市| 乌拉特中旗| 洞头县| 沅陵县| 莱阳市| 沂水县| 和龙市| 潜山县| 克东县| 武功县| 从江县| 新津县| 治多县| 邵东县| 津南区| 方正县|