dlopen與dlsym用法

dlopen和dlsym是用於打開動態連接庫中的函數,將動態連接庫中的函數或類導入到本程序中:
dlopen函數:
功能:打開一個動態連接庫
  包含頭文件:
  #include <dlfcn.h>
  函數定義:
  void * dlopen( const char * pathname, int mode );
  函數描述:
  在dlopen的()函數以指定模式打開指定的動態鏈接庫文件,並返回一個句柄給調用進程。經過這個句柄來使用庫中的函數和類。使用dlclose  
   ()來卸載打開的庫。
  mode:分爲這兩種
  RTLD_LAZY 暫緩決定,等有須要時再解出符號
  RTLD_NOW 當即決定,返回前解除全部未決定的符號。
  RTLD_LOCAL
  RTLD_GLOBAL 容許導出符號
  RTLD_GROUP
  RTLD_WORLD
  返回值:
  打開錯誤返回NULL
  成功,返回庫引用
  編譯時候要加入 -ldl (指定dl庫)
dlsym函數:
  函數原型是
  void* dlsym(void* handle,const char* symbol)
  該函數在<dlfcn.h>文件中。
  handle是由dlopen打開動態連接庫後返回的指針,symbol就是要求獲取的函數的名稱,函數  返回值是void*,指向函數的地址,供調用使用。
 
導入庫函數用法:
 

#include<dlfcn.h>
void* handle= dlopen("./hello.so", RTLD_LAZY);
typedef void(*hello_t)();
hello_t hello = (hello_t) dlsym(handle,"hello");

 hello();
dlclose(handle);
ide

注意庫函數在庫中的定義要用extern「c」來申明,這樣在主函數中才能經過「hello」來查找函數。申明的方式有如下兩種:函數

extern"C" int foo;
extern "C" void bar();
            
and

extern "C" {
     extern int foo;
     extern void bar();
}
spa

導入類庫方法:指針

#include"polygon.hpp" //類定義處

#include <dlfcn.h>

void* triangle= dlopen("./triangle.so", RTLD_LAZY);
create_t* create_triangle = (create_t*) dlsym(triangle,"create");

destroy_t* destroy_triangle = (destroy_t*) dlsym(triangle,"destroy");
polygon* poly = create_triangle();
// use the class

    poly->set_side_length(7);
        cout <<"The area is: " << poly->area()<< '\n';
// destroy the class

    destroy_triangle(poly);

    // unload the triangle library

    dlclose(triangle);

code

相關文章
相關標籤/搜索