Linux下动态链接库技术实现“消息映射表”

本文介绍了如何利用Linux下的动态链接库技术实现具有热插拔能力的“消息映射表”程序,该程序能动态增加新的菜单项和功能。通过配置文件监控、动态库生成、配置文件设计和动态库动态加载四个步骤,实现计算器程序在不改变主程序的情况下,根据用户输入加载不同功能的动态库和函数。
摘要由CSDN通过智能技术生成

题目:

利用动态链接库技术实现具有热插拔能力的“消息映射表”程序。程序在功能上表现为一个计算器程序,主菜单中提示:

Press A:Adding;

Press S:  Subtracting

Press M:  Multiplying

Press D:  Dividing

用户键入A则启动加法子程序,提示用户输入两个操作数,并输出计算结果。用户键入S则启动减法子程序。以此类推。子程序执行完毕之后再回到主菜单状态。

使该程序有热插拔能力是指可以通过配置文件在不改变主程序的前提下动态增加新的菜单项和新的功能(例如增加乘方、开方、指数、对数运算等。)


设计思路:首先,设计并实现程序所需的动态链接库,其次,在主函数中开辟一个线程监控配置文件是否被改变,如果配置文件发生改变则重新读取配置文件中内容。最后,根据用的不同输入加载不同的动态库和函数。根据设计思路,本文从动态库生成、配置文件设计、配置文件监控和动态链接库动态加载四个方面展开介绍。

1、动态链接库的生成

        要想使用动态链接库技术必须要有动态库,因此本节主要介绍linux下动态库的编译与链接。下面以题目中计算器程序为例为大家讲解。文件名为calculate1.c。

#include<stdio.h>
intAdd(int x,int y)
{
int tmp = x + y;
	printf("%d + %d = %d\n", x,y,tmp);
return tmp;
}
intSub(int x,int y)
{
int tmp = x - y;
	printf("%d - %d = %d\n", x,y,tmp);
return tmp;
}
intMultiply(int x,int y)
{
int tmp = x * y;
	printf("%d * %d = %d\n", x,y,tmp);
return tmp;
}
intDivide(int x,int y)
{
int tmp = x / y;
	printf("%d / %d = %d\n", x,y,tmp);
return tmp;
}

在linux下可以输入以下命令:
gcc -c -fPIC calculate1.c
gcc -shared -fPIC calculate1.o -o a.so

在这里解释一下编译命令
-c 就是将源文件calculate.c编译成成目标文件calculate.o。calculate.o为不完整的机器代码,因为这里只是简单的将高级语言转换成机器语言,确定不了函数的起始地址。
-fPIC PIC全称是Position Independent Code(位置无关的代码)。PIC使.so文件的代码段变成真正意义上的共享,PIC在编译阶段告诉编译器产生于位置无关的代码,也就是说在生成的代码中全部使用相对地址,没有绝对地址,可以被加载器加载到内存的任何位置都可以正确执行。如果编译时不加-fPIC,则加载.so代码时需要重定位,重定位就会修改代码内容,造成不便。
另外,由于平台的差异,GCC对shared支持不一样,有的shared包含了-fPIC,有的没有包含。因此,最好显式的加上fPIC。
-o  就是生成目标文件或可执行文件。
运行完上述命令即可看到文件目录下生成a.so文件。

2 、配置文件设计

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值