linux环境下如何创建一个静态函数库

linux 环境下的函数库有两种,一种静态的函数(*.a),另一种动态的函数库(*.so)。函数库是一些函数的集合,可以直接使用。c语言中用到了大量的函数库。函数库可以是让代码重复使用。这里演示一下,怎么创建一个函数。

linux下创建一个静态库就是创建一个*.a 文件。

比如有一个简单的需求,需要创建一个加法和减法的函数库。创建一个文件 add.c sub.c


# file add.c 
int add(int x ,int y) {
    return (x + y);
}

#file sub.c 
int sub(int x ,int y) {
    return (x - y);
}

生成一个静态库

gcc -c add.c sub.c
ls
add.c  add.o  sub.c  sub.o
# 创建静态库
ar crv libmy.a add.o sub.o
a - add.o
a - sub.o

静态库的使用,编辑一个测试的程序。文件的名字是  pro.c


#include <stdio.h>

int main() {
    printf("%d\n", add(1+2)); /* !!! 这里是故意写错误的 , 不应该是 + 应该是 , */

    return 0;
}

如果直接编译会出现错误

gcc pro.c
/tmp/ccxHBOhI.o: In function `main':
pro.c:(.text+0xf): undefined reference to `add'
collect2: error: ld returned 1 exit status

如果这样编译不会出错

 

gcc pro.c add.o

# 可以执行, 输出的错误是不正确的。
./a.out 

创建一个静态库

ar crv libmy.a add.o sub.o

创建一个头文件

file:  my.h

int add(int x, int y);
int sub(int x, int y);

修改pro.c

#include <stdio.h>
#include "my.h"
int main() {
    printf("%d\n", add(1+2)); /* !!! 这里是故意写错误的 , 不应该是 + 应该是 , */

    return 0;
}

重新编译可以看到会报错

gcc -o pro pro.c libmy.a
pro.c: In function ‘main’:
pro.c:5:5: error: too few arguments to function ‘add’
     printf("%d\n", add(1+2));
     ^
In file included from pro.c:2:0:
my.h:1:5: note: declared here
 int add(int x, int y);

通过函数库和头文件的方式可以检测错误。

修改后重新编译连接

# 下面三种写法都一样

gcc -o pro pro.c libmy.a
gcc -o pro pro.c -L . -lmy
gcc -o pro pro.c -L. -lmy

静态的库的优点是独立,编译生成后,可以独立运行。缺点是不灵活,修改代码需要重新编译,如果多个软件都用了这个静态库,每次修改所有的程序都要编译,并且软件的体检容易变大。

 

留下评论