#简述静态库概念
所有的编译系统都提供一种机制,将所有相关的目标模块打包成一个单独的文件,称为静态库(后缀名为.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,特在此声明。