linux C /C 动态链接库使用
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-03-24
age) : BasePeople(name,age) { cout << "student''s constructor invoked" << endl; } virtual ~student(){ cout << "student''s de-constructor invoked" << endl; } virtual void speak(){ int i = 0; while(i < 10){ cout << "I am a student, my name is " << this->name_ << ", and my age is " << this->age_ << endl; sleep(1); i; } } }; // 动态库文件libstudent.so中包含有在base.h中申明的两个extern "C" 方法 BasePeople* create_BasePeople(const string & name, const int age){ //student* sd = new student(name,age); return new student(name,age); } void delete_BasePeople(BasePeople * pp){ if(pp) delete pp; } 3)teacher.cpp,该文件和student.cpp一样,只是会生成libteacher.so动态库. // teacher.cpp #include "base.h" class teacher : public BasePeople{ public: teacher(const string & name, const int age) : BasePeople(name,age) { cout << "teacher''s constructor invoked" << endl; } virtual ~teacher(){ cout << "teacher''s de-constructor invoked" << endl; } virtual void speak(){ int i = 0; while(i < 10){ cout << "I am a teacher, my name is " << this->name_ << ", and my age is " << this->age_ << endl; sleep(1); i; } } }; BasePeople* create_BasePeople(const string & name, const int age){ //teacher* sd = new teacher(name,age); return new teacher(name,age); } void delete_BasePeople(BasePeople * pp){ if(pp)
delete pp; } 4)callPlugin.cpp调用类的实现 // callPlugin.cpp #include "base.h" #include <dlfcn.h> #include <pthread.h> class callPlugin{ typedef BasePeople* ObjectPtr; typedef ObjectPtr (*createObjectPtr)(const string &, const int); typedef void (*deleteObjectPtr)(ObjectPtr); public: callPlugin(const string & soPath, const int openMode = RTLD_LAZY) : soPath_(soPath), openMode_(openMode){ cout << "callPlugin constructor invoked!" << endl; } ~callPlugin(){ cout << "callPlugin de-constructor invoked!" << endl; } int excute(){ void * pluginHandler = openPlugin(); if(pluginHandler){ // 得到create_BasePeople方法的指针 createObjectPtr createFunc = (createObjectPtr) dlsym(pluginHandler,__CREATE_OBJECT__.c_str()); ObjectPtr people = NULL; if(createFunc){ people = createFunc("luoxiaoyi",23); people->speak(); people->test(); }else{ cout << "callPlugin::excute() createFunc error :" << dlerror() << endl; } // 得到delete_BasePeople方法的指针 deleteObjectPtr deleteFunc = (deleteObjectPtr) dlsym(pluginHandler,__DELETE_OBJECT__.c_str()); if(deleteFunc){ deleteFunc(people); }else{ cout << "callPlugin::excute() deleteFunc error :" << dlerror() << endl; } // 关闭pluginHandler,回收资源 dlclose(pluginHandle |
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: Linux下C编程(1)下一篇: Linux下编译OpenCV
关于linux C /C 动态链接库使用的所有评论