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