- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
.精品.
.精品.
.精品.
.精品.
电孑斛
学生姓名:学号:实验地点:清水河主楼A2-412指导教师:李林实验时间:
学生姓名:
学号:
实验地点:清水河主楼A2-412
指导教师:李林
实验时间:
一、 实验室名称:
Linux环境高级编程实验室
二、 实验项目名称:
插件框架实验
三、 实验学时:
4学时
四、 实验目的:
实践Linux环境下插件框架的开发。学习并掌握插件的工作原理。
五、 实验内容:
1、使用动态链接库实现打卬功能
开发一个程序,向屏幕打印Hello Worlds在不重新编译链接原程序
的前提下,将打印的文字改为“Hello China。
2、使用动态链接库实现自定义打卬功能
同时要打卬“Hello World,\打印“Hello China”,甚至同时打印未来
才会增加的其他打印信息。打印未来的这些信息,也不能重新编译链
接原程序。
3、一次只调用一种功能
通过命令行方式:./a.outhclp,输出所有插件实现的功能ID,以及该
功能ID对应的功能描述(参考代码3)
通过命令行方式:./a.out FuncID,调用具体打卬功能(每个插件导出
GetID接口)(参考代码4)
4、导出函数都放在一个类中
在版木3中,插件导出了 Print、GetID Help三个函数,主程序需要 使用多个容器分别保存这些函数地址。在复杂的业务逻辑中,导出的 函数可能更多,若还按照版本3的方式,代码维护性不佳。将三个导 出函数都放在一个类中,让插件外部获取该类的对象
版本1
程序代码如图1.1、图1.2、图1.3所示(程序是在Linux图形界面截
取的,木人的Ubuntu在字符界面无法显示中文注释):
?精品.
?精品.
.精品.
.精品.
function.cpp X
^include iostream
2
ustng namespace std;
4
extern - C- void Print( )//extern C-防止g “编译器对函数名进行修改 6{
cout ? Hello baby!!” ? endl;
图1.1功能函数
helloworld.cpp X
elude to£trean
2
using nanespace std;
4
extern HCF void world()//extern C防止g十十编译器对函数名进行修改 6{
7 cout ? ?Hello world!M ? endl;
8}
9
图 1.2 hello world 函数
监 main.cpp X
Mnclude dlfcn.h〃包含dlopen ()函数.*dlsym()函数,*dlerror()函数,于动态链接 库有短
^Include tostrean
3
using namespace std;
5
tnt matn()
7{
void *handle = dlopen(11./function.so1, RTLD_LAZY);//打幵动态链接库?爹数 1 是 动态彼接库的文件名.参数二是动态链接库的使用方法。RTLD.LAZY:动态地加入动态链接库 中的函数。返回值:岀错返回NULL。
if(handle == 0)
{
cout ? ?dlopen error** ? endl;
return 0;
}
14
typedef void (*FUNC_PRINT)( );//走义一个函数指针(扌旨向函数的指针)
*FUNC.PRINT它返回void类型.没有爹数。
FUNC_PRINT dl^print = (FUNC_PRINT)dlsym(handXe/ MPrinf );//dlsyn函数的功能
是咲射动态链接库中6勺函数,找到函薮地址,釜1是dlopen ()的返回值。参数2是动态链接库 中的函数名。dlsyn函数返回值:參数2所示函数被加载后,在进程地址空间中的地址,岀错则 返回NULL。
tf(dl_prtnt == 0)
{
cout ? dlsyn error11 ? endl;
return 0;
}
22
(dl_print)();//dlclose ()函数为卸载动态链接库°参数为dlopen的返回值。
24
dlclose(handle);
26
return 0;
}
图1.3主函数
首先,使用命令#g++ -fpic -shared -o function.so helloworld.cpp
function.cpp 将 helloworld.cpp 和 function.cpp 编写成动态库 function.S0o
如图1.4所示:
rooty YanYull in:/hone/yanyum hvc-or-cpp/L inux-tra i 1 /4dong-ta i-kii/
原创力文档


文档评论(0)