Linux链接静态库:从实践到成功

1. 静态库和动态库的区别

在学习链接静态库之前,我们需要了解一下静态库和动态库的区别。

1.1 静态库

静态库是指将程序所需要的库函数代码以及程序本身的代码全部打包成一个可执行文件的库,链接过程中会将库函数代码全部拷贝到可执行文件中。

优点:静态库的执行速度快,运行时不需要额外的加载,同时也避免在引用时发生版本不兼容问题。

缺点:每次编译都需要重新链接所有的库函数,导致可执行文件变得庞大。

1.2 动态库

动态库是指将库函数打包成一个文件,程序本身的代码与库函数代码是分开的。程序在启动时不载入库函数代码,而是等到调用库函数时才去加载动态库。

优点:动态库不会因为库函数的修改而导致程序需要重新编译和链接,同时也避免了静态库的可执行文件变得过大的问题。

缺点:动态库的运行速度相对静态库会稍慢,同时也会出现版本兼容性问题。

2. 静态库的链接

当我们需要使用静态库时,我们需要进行链接过程,将静态库的函数代码和我们的程序代码打包成一个可执行文件。

2.1 静态库的制作

下面是一个简单的计算器函数库的示例代码:

#include <stdio.h>

int add(int a, int b){

return a + b;

}

int sub(int a, int b){

return a - b;

}

int mul(int a, int b){

return a * b;

}

int div(int a, int b){

return a / b;

}

将以上代码保存为calc.c文件,使用以下命令编译为静态库:

gcc -o libcalc.a -c calc.c

ar rv libcalc.a calc.o

编译成静态库后,我们就需要进行静态库的链接了。

2.2 编译链接静态库

下面是一个使用静态库的示例程序:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "calc.h"

int main(){

int a = 10, b = 20;

int result = add(a, b);

printf("%d + %d = %d\n", a, b, result);

result = sub(a, b);

printf("%d - %d = %d\n", a, b, result);

return 0;

}

其中calc.h是我们提前编写好的头文件,内容如下所示:

#ifndef CALC_H

#define CALC_H

int add(int a, int b);

int sub(int a, int b);

#endif

我们通过include指令引入了calc.h头文件,这里我们只引用了add和sub函数,其他函数我们暂不需要。

下面是编译链接静态库的命令:

gcc -o main main.c -L. -lcalc

其中,-L.表示在当前文件夹下查找静态库文件,-lcalc表示链接libcalc.a静态库。编译过程中链接器会自动查找静态库文件。

使用以下命令运行程序:

./main

运行结果如下:

10 + 20 = 30

10 - 20 = -10

可以看到,程序成功地调用了add和sub函数,证明我们成功的链接了静态库。

3. 总结

本文介绍了静态库和动态库的区别,以及如何制作和链接静态库。静态库的使用会使程序变得庞大,但执行速度快,避免了版本兼容性问题。在实际开发中,我们需要根据实际情况选择使用静态库还是动态库。

操作系统标签