定义两个文件

//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 运行时系统中的其他模块