标签:__ 动态 plugin dlopen cpp getInterface include RTLD 加载
头文件: #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
标签:__,动态,plugin,dlopen,cpp,getInterface,include,RTLD,加载 来源: https://www.cnblogs.com/ho966/p/16031604.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。