linux C /C 动态链接库使用
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-03-24
这几天一直在弄C 、C的动态链接库的时候,经过了近4天的努力研究和整合,终于把这个功能应用到了CEP项目中,特此笔记. 有关动态链接库的概念,何时使用,使用的优点就不在此多多解释了,下面,简单记录一下使用的具体过程. 1、涉及到的库<dlfcn.h>,该库中提供了四个轻松调用动态链接库的API a) void *dlopen (const char *so_file_path, int open_mode) dlopen是打开动态链接库文件的API,这里so_file_path是so文件的路径,open_mode是打开so文件的模式, 常用的有两种:RTLD_NOW和RTLD_LAZY, RTLD_NOW:在dlopen()方法调用完成之前就去动态的解析so文件里面的所有未定义的符号,如果无法解析,则打开失败. RTLD_LAZY: 只有当so文件里面的未定义的符号在真正使用的时候才去解析. 这里要注意的是:如果加载的动态库还依赖其他的动态库,使用RTLD_NOW. 函数调用成功,则返回该so文件的句柄(指针)so_handle,否则返回NULL. b) void *dlsym (void *so_handle,const char *method_name) dlsym的调用是用来得到so文件某个具体的函数的指针的,函数调用成功则返回method_name函数的指针,否则返回NULL. so_handle:使用dlopen()返回的so句柄 method_name:定义在so中的方法名(这里要注意的是,该so方法中不能有重载的函数,当然,c语言是不支持函数重载的) c) int dlclose (void *so_handle) 关闭dlopen()返回的so句柄 这里要注意:如果在使用dlsym()返回的函数指针的时候调用了该方法,那么,肯定会出现Segment fault的错误,调用此方法之后,代表对so动态库的资源回收. d) char *dlerror (void) 返回在调用上述方法失败时的具体错误信息. 2、下面来看一个简单的实例:
该实例的场景是:把student.cpp和teacher.cpp写成动态库的形式提供给callPlugin.cpp调用,如果再需要开发一个其他的类如:police.cpp,只需要按照有关约定编写好,再编译成动态库,则可不要更改任何应用程序的框架代码,即 实现了插件式开发. 1)base.h,该文件的作用是定义两个基本方法,也就是接口方法,提供给接口调用者和接口实现者使用. // base.h #include<iostream> #include<string> using namespace std; class BasePeople; // 下面两个方法都用extern "C"进行修饰,这个主要是C 中的符号命名方法和C的不一样,具体可以查看有关资料 // 在C 中,方法method(int a, float b)可能会被命名为:method_int_float,而在C 中则命名为:method // 这其实就是C 能支持函数重载,而C却不能的主要原因之一 extern "C" BasePeople* create_BasePeople(const string & name, const int age); extern "C" void delete_BasePeople(BasePeople * pp); static const string __CREATE_OBJECT__ = "create_BasePeople"; static const string __DELETE_OBJECT__ = "delete_BasePeople"; class BasePeople{ public: BasePeople(const string & name, const int age) : name_(name),age_(age){ cout << "BasePeople''s constructor invoked" << endl; } virtual ~BasePeople(){ cout << "BasePeople''s de-constructor invoked" << endl; } virtual void speak() = 0; void test(){ cout << "This is the test method!" << endl; } protected: int age_; string name_; }; 2)student.cpp,该文件是class BasePeople的继承类,同时,该文件将被生成libstudent.so动态库,同时提供给callPlugin.cpp调用 // student.cpp #include "base.h" class student : public BasePeople{
public: student(const string & name, const int |
||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: Linux下C编程(1)下一篇: Linux下编译OpenCV
关于linux C /C 动态链接库使用的所有评论