共享库链接实例详解

#简述共享库概念

共享库是致力于解决静态库缺陷的一个现代创新产物。共享库是一个目标模块,在运行或加载时,可以加载到任意内存地址,并和一个在内存中的程序链接起来。这个过程称为动态链接,是由一个叫作动态链接器的程序来执行的。共享库也称为共享目标,在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,特在此声明。

发布了25 篇原创文章 · 获赞 6 · 访问量 2003

猜你喜欢

转载自blog.csdn.net/weixin_44711653/article/details/102077984