电子科技大学实验报告学生姓名:李学号:2016指导教师:李林实验地点:主楼A2-412实验时间:2016.11.23一、实验室名称:Linux环境高级编程实验室二、实验项目名称:插件框架实验三、实验学时:4学时四、实验目的:学习在Linux环境下插件框架的开发的使用,掌握如何开发一个高效有用的插件框架。五、实验内容:版本1:开发一个程序,向屏幕打印“HelloWorld”;在不重新编译链接原程序的前提下,将打印的文字改为“HelloChina”版本2:同时要打印“HelloWorld”,打印“HelloChina”,甚至同时打印未来才会增加的其他打印信息,打印未来的这些信息,也不能重新编译链接原程序版本3:版本2是同时调用所有插件的打印功能,现在要求一次只调用一种功能版本4:在版本3中,插件导出了Print、GetID、Help三个函数,主程序需要使用多个容器分别保存这些函数地址。六、实验步骤:版本一:function.cpp#includeiostreamusingnamespacestd;externCvoidPrint(){coutHellolifengendl;}main.cpp#includedlfcn.h#includeiostreamusingnamespacestd;intmain(){void*handle=dlopen(./function.so,RTLD_LAZY);if(handle==0){coutdlopenerrorendl;return0;}typedefvoid(*FUNC_PRINT)();FUNC_PRINTdl_print=(FUNC_PRINT)dlsym(handle,Print);if(dl_print==0){coutdlsymerrorendl;return0;}(dl_print)();dlclose(handle);return0;}运行结果截图:版本二:f1.cpp#includeiostreamusingnamespacestd;//输出文件需要用extern“C”修饰,这样才能被标准C语言调用externCvoidprint(){coutlifengendl;}f2.cpp#includeiostreamusingnamespacestd;externCvoidprint(){couthellolifengendl;}main.cpp#ifndefCPLUGINENUMERATOR_H#defineCPLUGINENUMERATOR_H#includevector#includestring#includedirent.h#includedlfcn.h#includeiostream#includestring.husingnamespacestd;boolgetPluginNames(vectorstring&v_plugin){//打开动态链接库的存放目录,返回目录的索引结构DIR*dir=opendir(./plugin);if(dir==0)returnfalse;for(;;){//返回一个direent结构体,结构体中包含了索引节点号和文件名structdirent*p=readdir(dir);if(p==0)break;//Linux文件目录下第一个为“.”表示当前目录,需要筛掉if(strcmp(p-d_name,.)==0)continue;if(strcmp(p-d_name,..)==0)continue;stringstr=./plugin/;//动态链接库的存放目录str+=p-d_name;//现在str为绝对路径v_plugin.push_back(str);//将绝对路径保存入向量}closedir(dir);returntrue;}intmain(){vectorstringv_plugin;if(!getPluginNames(v_plugin)){cout获取动态链接库名失败endl;return0;}for(inti=0;iv_plugin.size();i++){void*handle=dlopen(v_plugin[i].c_str(),RTLD_LAZY);//打开动态链接库if(handle==0){cout打开动态链接库出错endl;return0;}typedefvoid(*P_print)();P_printp_print=(P_print)dlsym(handle,print);//映射动态链接库函数if(p_print==0){cout映射动态链接库函数失败endl;return0;}(p_print)();dlclose(handle);}return0;}#endif运行结果截图:七、总结及心得体会:本次实验,学习在Linux系统下插件的开发和使用,实验过程中遇到很多困难,但在同学的帮助下解决了大部分困难,多交流也是很重要的学习方法。报告评分:指导教师签字: