头文件: #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