静态库与静态库

静态库

静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。win下静态库是以lib为后缀。
链接时间: 静态库的代码是在编译过程中被载入程序中。
链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。这样做优点是在编译后的执行程序不在需要外部的函数库支持,因为所使用的函数都已经被编进去了。缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。
例子如下:
创建一个文件夹分别有:time.h time.c test.c
time.h内容如下:
在这里插入图片描述
time.c 内容如下:
在这里插入图片描述
test.c内容如下:
在这里插入图片描述
无论静态库还是动态库都是由.o文件生成的,所以将time.c编译成time.o

1.生成.o

gcc -c time.c

在这里插入图片描述

2.由.o文件生成静态库文件

设静态库文件为mytime,静态库文件名就叫libmytime.a

ar cr libmytime.a time.o

生成了.a静态库
在这里插入图片描述
其中ar命令可以用来创建、修改库,也可以从库中提出单个模块。
-r  将文件插入库文件中
c  建立库文件

3. 静态库使用

gcc -o test test.c -static-lmytime -L.

在这里插入图片描述
其中
-static:表示程序静态链接
-lmytime:链接静态库mytime
-L.:链接时需指明静态库所在路径,“.”表示当前路径
执行test

./test

在这里插入图片描述
将静态文件libmytime.a 删掉,发现test仍然可以运行
在这里插入图片描述
这是因为静态库链接是在程序编译时就将所有代码整合到了程序中,编译后的可执行程序不再需要外部的函数库支持。

动态库

动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so
win下静态库是以dll为后缀。
链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便。

由.o文件生成动态库

设动态库的名字是mytime,则动态库文件为libmytime.so

gcc -shared -o libmytime.so time.o

在这里插入图片描述

动态库的使用

动态链接生成可执行文件test1

gcc -o test1 test.c -lmytime -L.

在这里插入图片描述

运行可执行文件

./test1

发现报错
在这里插入图片描述
错误是没有找到动态库libmytime.so 。因为进行动态链接时,程序并不会在当前目录中寻找动态库,而是会在/usr/lib目录下寻找,所以我们将动态库libmytime.so移动到/usr/lib下就可以了。
在这里插入图片描述
对于找不到库有两种方法:
(方法一)要把该连接库的路径加入环境变量LD_LIBRARY_PATH中;
(方法二)或者直接把该库拷入/lib,/usr/lib/等位置
在这里插入图片描述
对比发现静态库链接生成的可执行文件会比动态库链接生成的可执行文件大很多

猜你喜欢

转载自blog.csdn.net/wmdshhzsmile/article/details/84029676