快速业务通道

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、下面来看一个简单的实例:
Empire CMS,phome.net

该实例的场景是:把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{
Empire CMS,phome.net

public:
student(const string & name, const int

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号