一、静态库与动态库的区别
在Linux系统中,静态库(Static Library)和动态库(Dynamic Library)都是常见的软件库形式,用于存放已编译的代码和函数,供程序在运行时调用。它们之间有以下区别:
静态库:
- 静态库在编译时被链接到目标程序中,成为目标程序的一部分。链接过程将静态库的代码和数据复制到目标程序,使得目标程序在运行时不再依赖于该静态库的存在。
- 优点:静态库的主要优点是独立性强,嵌入到目标程序中,避免了对外部库的依赖。这种方式通常适用于小型应用程序,或者需要确保特定版本库的使用情况。
- 缺点:随着程序规模的增长,静态库可能导致目标程序过大,占用过多的磁盘空间。此外,如果多个程序使用同一个静态库,每个程序都会拷贝一份该库,造成资源浪费。
动态库:
- 动态库是一个单独的文件,与目标程序分离。在程序运行时,动态库通过动态链接器(如ld.so)加载到内存中,并与程序进行链接和解析。不同的程序可以共享同一份动态库,节约了磁盘空间和内存消耗。
- 优点:动态库的主要优点是节约系统资源,提高程序的共享性和可维护性。如果某个动态库更新,所有依赖该库的程序都可以受益于该更新,无需重新编译目标程序。
- 缺点:动态库的使用依赖于库的可用性和正确版本的安装。如果某个动态库在系统中缺失,或者版本不兼容,程序可能无法正常运行。
总结:
- 静态库在编译时被链接到目标程序中,独立存在,增加了目标程序的体积。
- 动态库在程序运行时加载,并与程序共享,节约空间但需要注意可用性和版本问题。
- 使用静态库时,程序与库的关系更紧密,而使用动态库时,程序与库的关系更松散。
在实际应用中,通常根据需求和具体情况选择使用静态库还是动态库。
二、静态库的制作与使用
静态库的格式:libhello.a
步骤:
①gcc hello.c -c //生成hello.o
②ar rcs libhello.a hello.o //将hello.o生成静态库libhello.a
使用(掐头去尾,把前面的lib和后面的后缀.a去掉):
编译时:gcc 主程序.c -lhello -L ./
-L ./的作用:优先从当前路径寻找库,再去默认库路径寻找
三、动态库的制作与使用
动态库格式:与静态库类似,前缀为“lib”,后缀变为“.so”,libhello.so
步骤:
gcc -shared -fpic hello.c -o libhello.so
使用:
先将libhello.so拷贝到 /usr/lib/
编译:gcc 主程序.c -lhello -L ./