Java教程

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

 

这篇关于dlopen加载动态库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!