1. 北纬博客网 > 站长经验 >

Linux静态库和动态库的生成与使用详细教程

我们在编写代码的时候经常用到已有的接口,他们是以库的形式提供给我们使用的,而常见形式有两种,一种常以.a为后缀,为静态库;另一种以.so为后缀,为动态库。那么这两种库有什么区别呢?


库文件,是一堆二进制代码实现的集合文件。我们要生成一个库,就是将一大堆代码实现打包生成一个库文件,其中不能包括main函数。
生成可执行程序链接动态库时,是将动态库中的函数信息表记录到可执行程序中,生成的可执行程序较小,运行时要加载动态库,不会造成代码冗余,在gcc编译器中就默认使用动态链接。
生成可执行程序链接静态库时,是将静态库中使用到的代码全部写入可执行程序中,生成的可执行程序较大,运行时不需要库文件,但却会造成代码冗余。
 
生成动态库
命名方式:以lib作为前缀,以.so作为后缀,中间为名称

 

动态库和静态库的使用分为:生成可执行程序时链接使用、运行可执行程序时加载使用(仅针对动态库)
 
生成可执行程序时链接使用
使用gcc编译器,在生成可执行程序时,使用-l选项指定要链接的库文件名称。
gcc编译器会默认去以下路径寻找库文件:
1 .将库文件放在默认指定的路径下 /lib64
2 .环境变量LIBRARY_PATH保存默认查找路径,将库文件所在路径添加到环境变量中:
export LIBRARY_PATH=${LIBRARY_PATH}:.
3 .使用gcc编译选项-L指定库文件所在路径:
gcc main.c -o main -l child -L./
 
运行可执行程序时加载使用(仅针对动态库)
gcc编译器会默认去以下路径寻找库文件:
1 .将库文件放在默认指定的路径下 /lib64
2 .环境变量LD_LIBRARY_PATH保存默认查找路径,将库文件所在路径添加到环境变量中。

目标文件

在解释静态库和动态库之前,需要简单了解一下什么是目标文件。目标文件常常按照特定格式来组织,在linux下,它是ELF格式(Executable Linkable Format,可执行可链接格式),而在windows下是PE(Portable Executable,可移植可执行)。

而通常目标文件有三种形式:

  • 可执行目标文件。即我们通常所认识的,可直接运行的二进制文件。
  • 可重定位目标文件。包含了二进制的代码和数据,可以与其他可重定位目标文件合并,并创建一个可执行目标文件。
  • 共享目标文件。它是一种在加载或者运行时进行链接的特殊可重定位目标文件。

本文由网上采集发布,不代表我们立场,转载联系作者并注明出处:https://www.bwboke.com/zzjy/203.html

联系我们

联系QQ:395045033点击这里给我发消息

微信号:

工作日:9:00-18:30,节假日休息