静态库链接实例详解

#简述静态库概念

所有的编译系统都提供一种机制,将所有相关的目标模块打包成一个单独的文件,称为静态库(后缀名为.a)。它可以用作链接器的输入。

当链接器构造一个输出的可执行文件时,它只复制静态库里被应用程序引用的目标模块。

 

#实例源程序

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 -c addvec.c multvec.c生成可重定位目标文件addvec.o和multvec.o

##(2)使用指令ar rcs libvector.a addvec.o multvec.o创建一个包含上述两个函数文件的静态库libvector.a

##(3)使用指令gcc -c main2.c生成可重定位目标文件main2.o

##(4)使用指令gcc -static -o prog2c main2.o ./libvector.a链接可重定位目标文件main2.o和静态库libvector.a生成可执行目标文件prog2c

##(5)使用指令./prog2c运行可执行目标文件prog2c

运行结果正确,打印出了向量加的最终结果。

#本博客参考了CSAPP,特在此声明。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值