一、库的概念
— 库一般也叫程序库 ---- 简称库
— 库是一个二进制文件,包含的代码可被程序调用。— 库的种类: 标准库,数学库,线程库 ……….
— 库有源码,可下载后编译;也可以直接安装二进制包。
— 系统中默认安装的库路径 /lib /usr/lib
— 库的作用:库是事先编译好的,可以复用的代码。
— 在os上运行的程序基本上都是使用库。使用库可以提高开发效率。
— Windows和Linux 下库文件的格式不兼容。
— Linux下包含静态库和共享库。
二、静态库
1、静态库的概念
— 编译(链接)时把静态库中相关代码 复制到 可执行文件中。
- 优点:程序中已包含代码,运行时不在需要静态库。
程序运行时无需加载库,运行速度更快
- 缺点:占用更多磁盘和内存空间。
静态库升级后,程序需要重新编译链接。
2、静态库创建
— 确定库中函数的功能、接口。
— 创建的 库 可能会链接很多个 .c .h文件
— 例子: 加入一个 hello.c
#include <stdio.h>
Void hello(void)
{
Printf(“hello word \n”);
Return;
}
— 编译生成 目标文件
Gcc –c hello.c -Wall
— 使用一个ar工具(专门用来创建 静态库)
— $ar crs libhello.a hell.o
可以是一个.o 也可以是多个.o
库命名规则 以lib 开始 ,以 .a 结束 ; 中间是 库命 hello
之后调用的是 库的名称即可。
— 查看库中符号信息
$nm libhell.a
Hello.o:
0000000 T hello
U puts
3、链接静态库
— #include <stdio.h>
void Hello(void);
int main(void)
{
hello();
return 0;
}
— 编译test.c 并链接 静态库 libhello.a
$ gcc -o test test.c -L. –lhello / $gcc –Wall test.c –o test –L. -lhello
-L.:需要链接的文件的路径,不写默认当前文件
-l :链接库的名称。
4、小结
— 根据静态库的缺点,系统明显倾向于 使用共享库。
三、共享库
1、共享库的概念
- 编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码。
程序不包含库中代码,尺寸小。
多个程序可共享同一个库。
程序运行时需要加载库。
库升级方便,无需重新编译程序。
2、共享库创建
- 确定库中函数的功能、接口。
- 编写库源码hello.c bye.c
#include <stdio.h>
Void hello(void)
{
Printf(“hello word \n”);
Return;
}
#include <stdio.h>
Void bey(void)
{
Printf(“bey! \n”);
Return;
}
- 编译生成目标文件
$gcc -c -fPIC hello.c bye.c -Wall / $gcc –c –fPIC hell.c bye .c –o hello.o bye.o
-fPIC : 告诉编译器要生成位置无关代码。生成的代码 可加载到任意的地址执行。使用相对寻址。
- 创建共享库 common
$ gcc –shared –o libcommon.so.1 hello.o bye.o
libcommon.so.1 说明:与静态库命名规则一样,前面必须加 lib 后面加.so 中间是库名。
最好.1 是库的版本,在系统保存同一个程序的不同版本,可能系统在使用时需要同一个软件的不用 版本,解决系统对软件兼容的问题。
- 为共享库文件创建链接文件
$ In –s libcommon.so.1 libcommon.so
3、链接共享库
- 将库制作一个头文件
- 编译test.c 并链接共享库 libcommon.so
$ gcc –o test test.c –L. –lcommon
- 系统 先链接共享库,在共享库找不到时再去 链接 静态库。
- 加一个参数 –static ,告诉编译器 直接链接静态库,不链接 共享库。
- 以上的方式,系统找不到 该共享库的路径。
需要通过一下三种方法 修改:
- 添加共享库的加载路径
$export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:.(.是当前 路径)
$./test
- 把库拷贝到/usr/lib和 /lib 目录下。(需要管理员权限 不建议)
- 在LD_LIBRARY_PATH环境变量中添加库所在路径。
$ sudo vi /etc/ls.so.conf.d/my.conf (添加一个my.conf文件,在文件中将库所在路径添加入该文件)
$sudo ldconfig (添加文件后 ,执行该命令)