Linux静态库和动态库的制作
我们在Linux中做一些项目的时候,有可能会制作自己的库,下面为大家简单介绍一下动态库和静态库的制作方法:
1、什么是库
/lib/i386-linux-gnu
/usr/include
1. 库是一种加密的二进制文件
2. 需要被操作系统载入内存运行
3. 相比于可执行程序,它不可以直接运行
4. window 和 linux 都有自己的库,但是不兼容
5. 库有两种,1. 静态库 2. 共享库(又叫动态库)
了解: 静态库 动态库
linux *.a *.so
window *.lib *.dll
$ gcc -E a.c -o a.i // 预编译 (预处理)
$ gcc -s a.i -o a.s // 编译 C语法装换为汇编语法
$ gcc -c a.s -o a.o // 汇编 汇编语法转换为二进制机器码
$ gcc a.o -o a.out // 可执行程序
2、静态库的制作和使用
1. 制作
$ gcc -c hello.c -o hello.o
$ ar -crs libxxx.a hello.o
静态库的命名规范:
必须以lib开头,紧跟库的名字,跟扩展名 .a
例如: libxxx.a
2. 使用
$ gcc main.c -L路径 -lxxx
-L: 指定静态库所在的目录
-l: 指定静态库的名字 xxx部分
3. 运行
$ ./a.out
优点:a.out 运行后不需要库,可以直接运行
缺点:
每个a.out都要包含库,体积较大, 浪费资源;
对程序更新,部署,发布带来麻烦;
3、动态库的制作和使用
1. 制作
$ gcc -fPIC -c add.c -o add.o
$ gcc -shared -o libxxx.so add.o
动态库的命名规范:
必须以lib开头,紧跟库的名字,跟扩展名 .so
例如: libxxx.so
2. 使用
$ gcc main.c -L路径 -lxxx
$ ldd a.out # 用于查看可执行程序依赖的动态库有哪些
3. 运行
$ ./a.out # 会报错
动态库的搜索方式(3种,任意选一种):
1. 将动态库拷贝到 /lib/ 或者 /usr/lib/
$ sudo cp libxxx.so /usr/lib/
2. export LD_LIBRARY_PATH=.或者so所在的路径
3.
pwd
cd /etc/ld.so.conf.d
ls
vim my.conf
添加路径
ldconfig生效
特点:在编译时不会链接到可执行文件中,只是再其中保存一个索引,在运行时,才真正的链接(动态),因此可执行程序体积小。
优点:
a.out 体积较小, 节约资源;
只需要修改.so动态库,有利于程序的更新,部署,发布;
缺点:a.out 运行后需要库,不能直接运行。