《电子科技大学Linux实验-(2).doc》由会员分享,可在线阅读,更多相关《电子科技大学Linux实验-(2).doc(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、_电 子 科 技 大 学实 验 报 告学生姓名:李 学 号:2016指导教师:李林实验地点:主楼A2-412 实验时间:2016.11.23一、实验室名称:Linux环境高级编程实验室二、实验项目名称:插件框架实验三、实验学时:4学时四、实验目的:学习在Linux环境下插件框架的开发的使用,掌握如何开发一个高效有用的插件框架。五、实验内容:l 版本1:开发一个程序,向屏幕打印“Hello World”;在不重新编译链接原程序的前提下,将打印的文字改为“Hello China”l 版本2:同时要打印“Hello World”,打印“Hello China”,甚至同时打印未来才会增加的其他打印信息
2、,打印未来的这些信息,也不能重新编译链接原程序l 版本3:版本2是同时调用所有插件的打印功能,现在要求一次只调用一种功能l 版本4:在版本3中,插件导出了Print、GetID、Help三个函数,主程序需要使用多个容器分别保存这些函数地址。六、实验步骤:版本一:function.cpp#include using namespace std;extern C void Print() cout Hello lifeng endl;main.cpp#include #include using namespace std;int main() void *handle = dlopen(./fu
3、nction.so, RTLD_LAZY); if(handle = 0) cout dlopen error endl;return 0; typedef void (*FUNC_PRINT)(); FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, Print); if(dl_print = 0)cout dlsym error endl;return 0; (dl_print)(); dlclose(handle); return 0;运行结果截图:版本二:f1.cpp#include using namespace std;/输出文件需要用e
4、xtern “C”修饰,这样才能被标准C语言调用extern C void print()coutlifeng endl;f2.cpp#include using namespace std;extern C void print()couthello lifengendl;main.cpp#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include #include #include #include #include #include using namespace std;bool getPluginNames(vector
5、& v_plugin)/打开动态链接库的存放目录,返回目录的索引结构DIR* dir=opendir(./plugin);if(dir=0)return false;for(;)/返回一个direent结构体,结构体中包含了索引节点号和文件名struct dirent* p=readdir(dir);if(p=0)break;/Linux文件目录下第一个为“.”表示当前目录,需要筛掉if(strcmp(p-d_name,.)=0)continue;if(strcmp(p-d_name,.)=0)continue;string str=./plugin/;/动态链接库的存放目录str+=p-d_
6、name;/现在str为绝对路径v_plugin.push_back(str);/将绝对路径保存入向量closedir(dir);return true;int main()vector v_plugin;if(!getPluginNames(v_plugin)cout获取动态链接库名失败endl;return 0;for(int i=0;iv_plugin.size();i+)void* handle=dlopen(v_plugini.c_str(),RTLD_LAZY);/打开动态链接库if(handle=0)cout打开动态链接库出错endl;return 0;typedef void(*P_print)();P_print p_print=(P_print)dlsym(handle,print);/映射动态链接库函数if(p_print=0)cout映射动态链接库函数失败endl;return 0;(p_print)();dlclose(handle);return 0;#endif运行结果截图:七、总结及心得体会:本次实验,学习在Linux系统下插件的开发和使用,实验过程中遇到很多困难,但在同学的帮助下解决了大部分困难,多交流也是很重要的学习方法。 报告评分: 指导教师签字:5_