#简述共享库概念
共享库是致力于解决静态库缺陷的一个现代创新产物。共享库是一个目标模块,在运行或加载时,可以加载到任意内存地址,并和一个在内存中的程序链接起来。这个过程称为动态链接,是由一个叫作动态链接器的程序来执行的。共享库也称为共享目标,在Linux系统中通常用.so后缀来表示。在Windows系统中通常用.dll后缀来表示。
#实例源程序
addvec.c
int addcnt = 0;//定义全局变量addcnt,用于记录向量加调用的次数
void addvec(int *x, int *y, int *z, int n) //函数无返回值,入口参数为3个整型指针变量和一个整型变量
{
int i;//定义循环变量
addcnt++;//全局变量addcnt加1
for (i = 0; i < n; i++)//做n次循环,完成向量加的操作
z[i] = x[i] + y[i];
}
multvec.c
int multcnt = 0;//定义一个全局变量multcnt,用于记录向量乘的次数
void multvec(int *x, int *y, int *z, int n)//函数无返回值,入口参数为三个整型指针变量,一个整型变量
{
int i;//定义一个循环变量
multcnt++;//全局变量multcnt加1,表示向量乘的次数增加1
for (i = 0; i < n; i++)//做n次循环,实现向量对应分量相乘,得到一个新的向量
z[i] = x[i] * y[i];
}
main2.c
#include <stdio.h>
#include "vector.h"//该文件定义了静态库libvector.a中例程的函数原型
int x[2] = {1, 2};//定义并初始化了x向量
int y[2] = {3, 4};//定义并初始化了y向量
int z[2];//定义了z向量
int main()
{
addvec(x, y, z, 2);//调用addvec函数实现向量加
printf("z = [%d %d]\n", z[0], z[1]);//输出z向量
return 0;
}
vector.h(主程序中自定义的头文件)
void addvec(int *x, int *y, int *z, int n);
void multvec(int *x, int *y, int *z, int n);
int getcount();
##(1)使用命令gcc -shared -fpic -o libvector.so addvec.c multvec.c将两个函数文件生成共享库libvector.so
##(2)使用命令gcc -o prog21 main2.c ./libvector.so生成可执行文件prog21(该文件的形式使得它在运行时可以与libvector.so链接)
扫描二维码关注公众号,回复:
8902490 查看本文章
##(3)使用命令./prog21运行可执行文件prog21
运行结果正确,打印出了向量加的结果。
#本博客参考了CSAPP,特在此声明。