使用GCC编译器在C/C++中链接静态库

静态库

之所以称为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
静态库的一些特点:

  • 静态库对函数库的链接是放在编译时期完成的。

  • 程序在运行时与函数库再无瓜葛,移植方便。

  • 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

创建C/C++静态库

创建一个C/C++静态库非常简单,静态库基本上是一个对象文件的打包文件(如zip文件),它是从.c/.cpp源代码编译而来的。每个源代码都包含导出的函数。例如,我们创建两个源文件:分别包含两个函数的test1.c和test2.c。

// test1.c
int test1(int a) {
    return a + 1;
}
// test2.c
void test2(int *c) {
    *c = *c + 1;
}

然后将他们编译为静态库.o目标文件

gcc  -c test1.c test2.c

-c参数表示编译,但不链接。我们将得到两个文件:test1.o和test2.o,它们是目标文件
接着,我们将目标文件归档

$ ar rsv testlib.a test1.o test2.o
ar: creating testlib.a
a - test1.o
a - test2.o

程序ar配合参数-r创建一个新库testlib.a,并将命令行中列出的文件打包入其中。这种方法,如果testlib.a已经存在,将会覆盖现在文件,否则将新创建文件。

链接静态库

现在,我们创建一个文件来链接这个静态库

#include <stdio.h>
int main() {
    int c = 3;
    test2(&c);
    printf("%d\n", c);
    printf("%d\n", test1(c));
    return 0;
}

要编译它,我们需要将testlib.a也作为源文件传递,这样gcc编译器才知道在后面去链接它。

gcc  -o test.out test.c testlib.a

或者,你也可以使用-L,-l参数来具体指明静态库链接

gcc -o test.out test.c -L. -ltestlib

参考