一、库的概念
库是一个二进制文件,包含的代码可被程序调用。包括标准C库、数学库、线程库…… 库有源码,可下载后编译;也可以直接安装二进制包。
Linux中的库保存在/lib /usr/lib路径中。
库是事先编译好的,可以复用的代码。 在OS上运行的程序基本上都要使用库。使用库可以提高开发效率。 Windows和Linux下库文件的格式不兼容,Linux下包含静态库和共享库。
二、静态库
编译(链接)时把静态库中相关代码复制到可执行文件中
优点
1、程序中已包含代码,运行时不再需要静态库
2、程序运行时无需加载库,运行速度更快
缺点
1、占用更多磁盘和内存空间
2、静态库升级后,程序需要重新编译链接
(1)、静态库创建
确定库中函数的功能、接口
编写库源码
编译生成目标文件 $ gcc -c 库源码.c -Wall
创建静态库 hello $ar -rsv lib静态库名字.a 目标文件.o
查看库中符号信息
(2)、链接静态库
编写应用程序test.c
编译test.c 并链接静态库libprint.a
$gcc -o test test.c -L. -l静态库名字(不包含lib前缀和.a后缀)
运行可执行文件 $ ./test hello world!
三、共享库 (动态库)
编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码
优点
1、程序不包含库中代码,尺寸小
2、多个程序可共享同一个库
缺点
1、程序运行时需要加载库
2、库升级方便,无需重新编译程序
3、使用更加广泛
(1)、共享库创建
确定库中函数的功能、接口
编写库源码(同上)
编译生成目标文件 $ gcc -c -fPIC 库源码.c -Wall
生成与位置无关的目标文件
创建共享库 $ gcc -shared -o lib共享库名字.so 目标文件.o
(2)、链接共享库
编写应用程序test.c
编译test.c 并链接共享库libprint.so $ gcc -o test test.c -L. -l共享库名字(不包括lib前缀和.so后缀)
$./test 执行后找不到共享库
(3)、加载共享库
添加共享库的加载路径 $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
$ ./test 执行后打印 Hello World!