定义两个文件
//addvec.c
int addcnt = 0;
void addvec(int *x, int *y,
int *z, int n)
{
int i;
addcnt++;
for ( i = 0; i < n; i++)
z[i] = x[i] + y[i];
}//multvec.c
int multcnt = 0;
void multvec(int *x,int *y,
int *z,int n)
{
int i;
multcnt++;
for (i = 0; i < n; i++)
z[i] = x[i] * y[i];
}将这两个 .c 文件创建为一个静态库
- 先编译为目标文件,
- 再将两个目标文件打包为静态库
linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o为了使用这个库,我们可以编写一个应用,main2.c,它调用 addvec 库例程。包含(或头)文件 vector .h 定义了 libvector.a 中例程的函数原型
//main2.c
#include <stdio.h>
#include "vector.h"
int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];
int main()
{
addvec(x, y, z, 2);
printf("z = [%d %d]\n", z[0], z[1]);
return 0;
}为了创建这个可执行文件,我们要编译和链接输入文件 main.o 和 libvector.a:
linux>gcc -c main2.c
linux>gcc -static -o prog2c main2.o ./libvector.a或者等价地使用:
linux>gcc -c main2.c
linux>gcc -static -o prog2c main2.o -L. -lvector-static 参数告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件,它可以加载到内存并运行,在加载时无须更进一步的链接。-lvector 参数是 libvector.a 的缩写,-L. 参数告诉链接器在当前目录下查找 libvector.a

当链接器运行时,它判定 main2.o 引用了 addvec.o 定义的 addvec 符号,所以复制 addvec.o 到可执行文件
因为程序不引用任何由 multvec.o 定义的符号,所以链接器就不会复制这个模块到可执行文件
链接器还会复制 libc.a 中的 printf.o 模块,以及许多 C 运行时系统中的其他模块