题目:
利用动态链接库技术实现具有热插拔能力的“消息映射表”程序。程序在功能上表现为一个计算器程序,主菜单中提示:
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文件。