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