库的制作
库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。
库的种类
Linux下库分为两种,静态库和动态库。
- 静态库:静态库在程序编译的时候会被连接到目标代码里面,所以程序运行的时候就不需要该静态库了。因此编译出来的程序体积就比较大。静态库以lib开头,以.a结尾。
- 动态库:(动态库也叫共享库)动态库在程序编译的时候不会被连接到代码里面,而是在程序运行的时候被载入的,所以程序运行的时候就需要该动态库。因此使用动态库编译出来的程序体积就比较小。动态库以lib开头,以.so结尾。
静态库的制作
静态库的制作步骤
- 编写或准备库的源代码
- 将源码.c文件编译生成.o文件
- 使用ar命令创建静态库
- 测试库文件
- 创建 mylib.c 文件
#include <stdio.h>
void mylib(void);
void mylib(void)
{
printf("This is mylib\n");
}
- 编译
gcc -c mylib.c
- 使用ar命令创建库文件
ar cr libmylib.a mylib.o
参数说明:
c: 创建
r: 覆盖
知识点:
libmylib.a: 库文件名
mylib: 库名
- 编写测试代码,创建test.c
#include <stdio.h>
void mylib(void);
int main(void)
{
mylib();
return 0;
}
- 编译
gcc test.c -lmylib -L.
参数说明:
-l 后面跟库名
-L 后面跟库路径,当前路径为 “.”
动态库的制作
动态库的制作步骤
- 编写或准备库的源代码
- 将源码.c文件编译成.o文件
- 使用gcc命令创建动态库
- 测试库文件
- 将源码.c文件编译成.o文件
gcc -c -fpic mylib.c
参数说明:
-c 输出.o文件
-fpic 产生位置无关代码(动态库可以被多个目标代码加载,每个目标代码的地址都是不一样的,所以需要加 -fpic)
- 使用gcc命令创建动态库
gcc -shared -o libmylib.so mylib.o
参数说明:
-shared 生成动态库
-o 指定库文件名
- 编译test.c
gcc test.c -lmylib -L .
如果我们的程序代码用到了库文件里面的函数,我们在编译的时候需要链接库。系统默认会在/lib或者/usr/lib去找库文件。或者在编译的时候我们指定库的路径。
在动态库使用时,系统会默认去/lib,/usr/lib目录下去找动态函数库,如果我们使用的库不在里面,就会提示错误。解决这个问题有三种方法。
第一种方法:
将生成的动态库拷贝到/lib或者/usr/lib里面去,因为系统会默认去这两个路径下寻找。(自己生成的库,不建议这么加)
第二种方法:
把我们的动态库所在的路径加到环境变量里面去,比如我们动态库所在的路径为/home/test,我们就可以这样加。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/test
此方法只对当前终端有效。
第三种方法:
修改ubuntu下的配置文件/etc/ld.so.conf,我们在这个配置文件里面假如动态库所在的位置,然后使用命令ldconfig更新目录。(该命令在/sbin目录下)