1. 程式人生 > 其它 >dlopen載入動態庫

dlopen載入動態庫

標頭檔案:
#include <dlfcn.h>
函式定義:
void * dlopen( const char * pathname, int mode);

mode:
  RTLD_LAZY 暫緩決定,等有需要時再解出符號
  RTLD_NOW 立即決定,返回前解除所有未決定的符號。
  RTLD_LOCAL
  RTLD_GLOBAL 允許匯出符號
  RTLD_GROUP
  RTLD_WORLD
返回值:
  開啟錯誤返回NULL
  成功,返回庫引用

plugin.h標頭檔案中定義介面

#ifndef __PLUGIN_H__
#define __PLUGIN_H__
#include 
"stdio.h" class IPlugin { public: virtual void print()=0; }; #endif

main.cpp

#include "plugin.h"
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
typedef IPlugin* (*func)();
int main()
{
    
    void* handle = dlopen("/home/hongrui/work/dlopen/libplugin.so", RTLD_NOW);
    
    
if (!handle) { printf("dlopen:%s\n",dlerror()); return -1; } func getInterface = (func)dlsym(handle, "getInterface"); if (getInterface == NULL) { printf("dlsym:%s\n", dlerror()); return -1; } IPlugin* plugin = getInterface(); plugin->print();
   dlclose(handle
);
return 0; }

編譯main.cpp 生成可執行檔案

  g++ main.cpp -o main -ldl

plugin.cpp是動態庫cpp

#include "plugin.h"
#include "stdio.h"
class CPlugin : public IPlugin
{
public:
    CPlugin() {}
    virtual ~CPlugin(){}
    virtual void print()
    {
        printf("this is plugin\n");
    }
};

extern "C" __attribute__ ((visibility("default"))) IPlugin* getInterface()
{
    return new CPlugin;
}

編譯plguin.cpp生成動態庫libplugin.so

  

g++ -fvisibility=hidden -fpic -shared  plugin.cpp -o libplugin.so -ldl