动态库与静态库

1.一个源程序的编译链接过程
我们自己写的一个源文件一定会用到一些库函数,这里就涉及到了库的动态链接和静态链接,首先我们先来了解一下,一个源文件hello.c由加载到运行所经历的一系列步骤
这里写图片描述
2.静态库、动态库的基本概念
什么是静态库,静态库的后缀是什么?
所谓静态库,是指程序在编译链接的过程中将库中的代码链接到可执行文件中,程序运行的过程中不在需要静态库。
在Windows下,静态库的后缀是.lib,linux系统下,静态库的后缀是.a。
什么是动态库,动态库的后缀是什么?
所谓动态库,是指程序在运行的时候才去链接运行的代码,多个程序共享使用库的代码。
在Windows下,动态库的后缀是.dll,linux系统下,动态库的后缀是.so
3.编写和使用静态库
(1)首先编写add.h add.c sub.c sub.h四个文件
这里写图片描述
(2)生成.o文件 gcc -c add.c sub.c
这里写图片描述
(3)打包生成静态库
使用命令:ar -rc libmath.a add.o sub.o
//这个叫做math库,库必须以lib开头,静态库以.a结尾,动态库以.so结尾
(4)使用库:要使用库,首先要将库和头文件进行导入
导入库文件使用命令:cp ../libmath.a .
导入头文件 cp ../*.h .
(5)写函数进行测试
(6)gcc -o main main.c -L.
//在当前目录下查找库,在这里如果不加入math库编译器会显示找不到
gcc -o main main.c -L. -lmath //在math库下进行查找
这里写图片描述
(7) ./main 运行
4.编写和使用动态库
(1)首先编写add.h add.c sub.c sub.h四个文件
这里写图片描述
(2)使用库:要使用库,首先要将库导入 cp ../libmath.a .
将头文件导入 cp ../*.h .
(3)生成.o文件 gcc -fPIC -c add.c sub.c
这里写图片描述
(4)生成共享库 gcc -shared -o libmath.so *.o
这里写图片描述
(5)动态库的使用:将库和头文件导入
头文件的导入:cp ../*.h .
库的导入:cp ../*.so .
(6)创建测试函数进行编译
gcc -o main main.c -L. -lmath
ldd 程序名:用来记录一个应用程序所依赖的动态库
(7)库的导入
a)方法1:拷贝.so文件到系统共享库路径下,一般指/usr/lib
b)方法2:更改环境变量 export LD_LIBRARY_PATH=.
指定自己的目录 mkdir /home/wyn/so
将动态库放入自己指定的目录下 mv libmath.so /home/wyn/so
(8)导入之后,需要添加一个文件,这个文件命名没有任何要求
首先创建一个路径:cd /etc/ld.so.conf.d/ ,在这个路径下创建一个文件 so.conf ,打开so.conf将之前自己指定的目录写进去。
(9)使用ldconfig命令使刚刚导入的目录生效
(10)退出回到上一级自己的测试目录下编译 gcc -o main main.c -L/home/wyn/so -lmath
(11)运行./main
5.静态库与动态库的比较
系统默认使用动态链接库
(1)静态链接是指每一个程序都有自己所需要代码的一部分,从库中将这部分代码拷过来,以后不在需要库;
(2)动态链接需要依赖动态库,静态链接可移植性好,动态链接库可移植性差,静态链接导致程序体积变大,动态链接程序体积小。
(3)静态库是程序运行的时候已经调入内存,不管有没有调用,都会在内存里头;动态库是程序运行的时候需要调用的时候才装入内存,不需要的时候是不会装入内存的。

猜你喜欢

转载自blog.csdn.net/wyn126/article/details/79894169