目录
一、Linux共享库、静态库、动态库
1、什么是库
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
2、库的种类
linux 下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此代码体积较大。
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
静态库:
优点:
1.静态库被打包到应用程序中加载速度快
2.发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
2.更新、部署、发布麻烦。
动态库:
优点:
1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
1.加载速度比静态库慢
2.发布程序需要提供依赖的动态库
3、Linux中命名系统中共享库的规则:
lib-name-.so-.x-.y-.z
分别代表:
固定代表共享库
共享库名称
固定后缀
主版本号
次版本号
发行版本号
4、库的制作
a、静态库的制作:(格式xxx.a)
例如:制作config.c文件
gcc config.c -c(生成 .o 文件)ar rcs libconfig.a config.o(把 .o 文件生成 .a 静态库文件)
pi@raspberrypi:~ $ cd file1/
pi@raspberrypi:~/file1 $ ls
a.out config.c config.h test.c
pi@raspberrypi:~/file1 $ gcc config.c -c
pi@raspberrypi:~/file1 $ ls
a.out config.c config.h config.o test.c
pi@raspberrypi:~/file1 $ ar rcs libconfig.a config.o
pi@raspberrypi:~/file1 $ ls
a.out config.c config.h config.o libconfig.a test.c
b、动态库的制作:(格式xxx.so)
gcc -shared -fpic config.c -o libconfig.so
- -shared 指定生成动态库
- -fpic标准,fPIC选项作用于编译阶段,在生成目标文件是就得使用该选项,以生成位置无关的代码;参数声明链接库的代码段是可以共享的;
- libconfig.so 生成的动态库名
5、库的使用
a、静态库:
test.c 使用 libconfig.a 静态库文件:
gcc test.c -lconfig -L ./ -o one
- -l 表示是制定要用的动态库,库民砍头去尾(libconfig.a,去掉 lib 和 .a )
- -L 告诉 gcc 编译器从-L制定的路径去找静态库( ./ 当前路径),默认是从
/usr/lib /usr/local/lib去找 - test.c 是主函数main
pi@raspberrypi:~/file1 $ ls
config.h libconfig.a test.c
pi@raspberrypi:~/file1 $ gcc test.c -lconfig -L ./ -o one
pi@raspberrypi:~/file1 $ ./one
6
7
1
3
b、动态库:
test.c 使用 libconfig.a 动态库文件:
gcc test.c -lconfig -L ./ -o mainProDyexport LD_LIBRARY_PATH="/home/pi/file1"指定动态库的位置,这也是临时的,可以写个 .sh 脚本来 指定动态库的位置和执行mainProDy。
pi@raspberrypi:~/file1 $ gcc test.c -lconfig -L ./ -o mainProDy
pi@raspberrypi:~/file1 $ ls
config.c config.h libconfig.a libconfig.so mainProDy one test.c
pi@raspberrypi:~/file1 $ ./mainProDy
./mainProDy: error while loading shared libraries: libconfig.so: cannot open shared object file: No such file or directory
pi@raspberrypi:~/file1 $ pwd
/home/pi/file1
pi@raspberrypi:~/file1 $ export LD_LIBRARY_PATH="/home/pi/file1"
pi@raspberrypi:~/file1 $ ./mainProDy
6
7
1
3
sh 脚本
pi@raspberrypi:~/file1 $ cat test.sh
export LD_LIBRARY_PATH="/home/pi/file1"
./mainProDy
pi@raspberrypi:~/file1 $ chmod +x test.sh
pi@raspberrypi:~/file1 $ ls
config.c config.h libconfig.a libconfig.so mainProDy one test.c test.sh
pi@raspberrypi:~/file1 $ ./test.sh
6
7
1
3
注:
- “~” 表示工作目录
pi@raspberrypi:~ $ cd file1/
pi@raspberrypi:~/file1 $ cd ~
pi@raspberrypi:~ $
- du 计算文件大小
pi@raspberrypi:~/file1 $ du mainProDy
12 mainProDy //动态的
pi@raspberrypi:~/file1 $ du one
12 one //静态的
程序太小体现不出来大小
- 引用动态库的程序,怎么指定动态库的位置:
带动态库的程序,可以指定该程序运行时候,在LD_LIBRARY_PATH所指的的路径去找库文件,例如:
export LD_LIBRARY_PATH="/home/pi/file1"
本文详细介绍了Linux中的库类型,包括静态库与动态库的区别、命名规则,以及它们的制作和使用方法。通过实例演示了如何创建和使用这两种库,以及在实际项目中的注意事项。

862

被折叠的 条评论
为什么被折叠?



