快速业务通道

linux C /C 动态链接库使用

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-24
r);
pluginHandler = NULL;
}else{
cout << "callPlugin::excute() pluginHandler error :" << dlerror() << endl;
}
}
private:
// so动态库的路径,可以是绝对路径,也可以是相对路径
Empire CMS,phome.net

string soPath_;
// so动态库的打开模式RTLD_NOW,RTLD_LAZY
int openMode_;

/**
* 调用dlopen,同时得到相关so文件的句柄
*/
void* openPlugin(){
if(soPath_.size() < 1){
cout << "plugin file[soPath=" << soPath_ << "] cannot be empty!" << endl;
return NULL;
}

if(openMode_ == RTLD_NOW || openMode_ == RTLD_LAZY)
return dlopen(soPath_.c_str(),openMode_);
else
return dlopen(soPath_.c_str(),RTLD_LAZY);
}
};

// 供多线程调用的方法
void* callFun(void *arg){
callPlugin* cp = (callPlugin*) arg;
cp->excute();
}
/*************************************************** main() **********************************************/
int main(){
// 加载动态库
callPlugin cp1("libstudent.so"); // ----------------------------->标记1
callPlugin cp2("libteacher.so"); // ----------------------------->标记2

// 创建新线程,用于调用libteacher.so的执行
pthread_t thread;
pthread_create(&thread,NULL,callFun,&cp2);

// 执行
cp1.excute();

// 等待thread线程执行完毕
pthread_join(thread,NULL);
return 0;
}

5)编译指令
g teacher.cpp -fPIC -shared -o /usr/local/cep/libteacher.so
g student.cpp -fPIC -shared -o /usr/local/cep/libstudent.so
g callPlugin.cpp base.cpp -o callPlugin -ldl -pthread

6)可能出现的问题以及参考解决方案
编译完成之后,如果你此时运行./callPlugin,则可能会报无法找到动态库的错误.解决的方法如下:
a)讲main方法中的标记1和2里面so文件的路径改为绝对路径/usr/local/cep/libstudent.so、/usr/local/cep/libteacher.so,重新编译callPlugin.cpp,然后运行,如果还不行尝试b);
Empire CMS,phome.net

b)如果你有root权限,可以通过修改/etc/ld.so.conf来达到此目的,修改方法为:在/etc/ld.so.conf中加入你的so所在的目录,在这里如:/usr/local/cep,完了之后,再运行ldconfig命令,至于为何要这样,您可以网上搜下/etc/ld.so.conf的作用,如果没有root权限,则可尝试c);
c)没有root权限的情况,可以通过用环境变量LD_LIBRARY_PATH指定路径,但是这里要注意的是,不同的系统可能环境变量不一样,指定方法如:LD_LIBRARY_PATH=.;这样就把LD_LIBRARY_PATH指定为当前目录,然后使用export LD_LIBRARY_PATH命令即可.

通过以上三步,你基本可以解决库文件无法找到的问题了,如果还是无法解决相关问题,那么请网上找找对应的错误咯
注意:添加了-c参数,即g -c那么很有可能出现only ET_DYN and ET_EXEC can be loaded错误,解决方法简单,去掉-c即可.

3、以上是我最近自己所学的小总结,希望能给正在研究这方面知识的朋友有些许帮助,我也是刚学,所有,如果有什么错误,还望不吝指出,谢谢!

本文出自 “风轻云淡” 博客,请务必保留此出处http://beyond99.blog.51cto.com/1469451/737840

Empire CMS,phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号