linux C /C 动态链接库使用
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-03-24
r); pluginHandler = NULL; }else{ cout << "callPlugin::excute() pluginHandler error :" << dlerror() << endl; } } private: // so动态库的路径,可以是绝对路径,也可以是相对路径
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);
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
|
|||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: Linux下C编程(1)下一篇: Linux下编译OpenCV
关于linux C /C 动态链接库使用的所有评论