(一)发行版:Ubuntu16.04.7
(二)记录:
1.什么是库
库:一种可执行的二进制文件,是编译好的代码。
2.库的分类
静态库:在编译时会被链接到程序代码中。在程序运行不需要静态库,因为已经被链接进去了。编译出的内存占比较大。以lib开头,”.a“结尾。
动态库:在编译时不会被链接到程序代码中,在程序运行时载入。在程序运行时需要动态库。编译出的内存占比较小。以lib开头,以“.so”结尾。
3.静态库制作流程
(1)编写或准备库的源代码
#include <stdio.h>
void mylib(void);
void mylib(void)
{
printf("this is my lib\n");
}
(2)将源码.c文件编译为.o文件
(3)使用ar命令创建静态库
ar cr libMyLib.a MyLib.o
// c - create
// r - replace
//lib开头
//.a代表静态库
libMyLib.a 为库文件名
MyLib 为库名
(4)测试库文件
a.编写一个testlib.c测试
#include <stdio.h>
void mylib(void);
void main()
{
mylib();
}
b.编译
gcc testlib.c -lMyLib -L .
// -l为指定静态库名
// -L为指定静态库路径,接.即代表库在当前路径
4.动态库制作流程
(1)编写或准备库的源代码
(2)将源码.c文件编译生成.o文件
gcc -c -fpic mylib.c
//-fpic产生位置无关代码
(3)使用gcc命令创建动态库
gcc -shared -o libMyLib.so MyLib.o
//-shared 生成动态库
(4)测试库文件(a.out已经删除,重新生成·)
gcc testlib.c -lMyLib -L .
// -l指定动态库名
// -L指定动态库路径
此时生成的a.out不能直接运行,因为没有依赖库。有三种办法解决:
第一种:将生成的动态库拷贝到/lib或者/usr/lib里面去,因为系统会默认去这两个路径下寻找。
第二种:把我们的动态库所在的路径加到环境变量里面去,比如我们动态库所在的路径为/home/samba/MyLib,我们就可以这样添加。这种方法只对当前终端有效(退出则失效)。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/samba/MyLib
查看环境变量
退出终端再进来打印已经失效
第三种:修改ubuntu下的配置文件/etc/ld.so.conf,我们在这个配置文件里面加入动态所在的位置,然后使用ldconfig更新目录。
vi /etc/ld.so.conf
(三)命令: