库文件:静态库与动态库的生成和使用

article/2025/8/18 10:54:51

0.引言

当进行C语言的编写时,想要查看标准库的某个函数是怎样实现的,比如 stdio.h 里的 printf 函数,跳转后只能看见函数声明,而无法跳转到函数的定义处,为什么无法查看函数的定义,这就涉及到库文件使用。

1.库文件是什么

C程序由 .c 文件最终变成可执行文件要经历预编译,编译,汇编和链接过程,在 Linux 下不同的过程分别生成如下文件 .i,.s,.o 和最终的可执行文件。而库文件就是一组预先编译好的函数的集合,它由 .o 文件生成,而 .o 是一个二进制文件,里面的内容是无法直接理解的,这也是为什么查看不了库中函数的定义,不能看,只能用。Linux 中库的位置一般在 /lib,/usr/lib 和 /usr/lib64 下,而库的头文件一般放在 /usr/include 下。库有两种,一种是静态库,命名形式是 libxx.a,一种是动态库(又叫共享库),命名形式是 libxx.so

2.静态库的生成与使用

2.1.静态库的生成

创建两个 .c 文件和一个 .h 文件,其中 add.c 和 mul.c 文件中包含函数的定义,foo.h 文件中包含函数的声明,具体内容如下。
在这里插入图片描述

首先将需要生成库文件的所有 .c 文件编译生成 .o 文件。
在这里插入图片描述

利用 ar 命令将所有 .o 文件生成静态库,需要三个参数:c 创建库,r 将方法添加到库中,v 显示过程。
在这里插入图片描述

其中,libfoo.a 就是所生成的静态库。

2.2.静态库的使用

编写一个 main.c 文件,其中调用 add 和 mul 两个函数。
在这里插入图片描述

直接利用 libfoo.a 和 main.c 文件生成可执行文件,涉及到两个参数:-L 指定所使用的静态库的位置,-l 指定静态库的名字(去掉静态库名字里的前缀 lib 和后缀 .a)。
在这里插入图片描述

3.动态库的生成与使用

3.1.动态库的生成

同样利用 add.c 和 mul.c 来生成动态库,其中 foo.h 中是函数的声明,add.c 和 mul.c 中是函数的定义。
在这里插入图片描述

首先将需要生成库文件的所有 .c 文件编译成 .o 文件。
在这里插入图片描述

使用 gcc 命令和所有 .o 文件来生成动态库。
在这里插入图片描述

其中,libfoo.so 就是所生成的动态库。

3.2.动态库的使用

编写一个 main.c 文件,其中调用 add 和 mul 两个函数。
在这里插入图片描述

直接利用 libfoo.so 和 main.c 文件生成可执行文件,涉及到两个参数:-L 指定所使用的动态库的位置,-l 指定动态库的名字(去掉动态库名字里的前缀 lib 和后缀 .so)。需要注意的一点是,如果库的存储路径下存在同名的静态库和动态库,gcc 默认使用动态库。
在这里插入图片描述

gcc 命令执行完之后会生成可执行程序 main,执行 main 会出现报错。
在这里插入图片描述

原因是程序运行时加载动态库,找不到对应的动态库文件 libfoo.so,这是由于虽然用参数 -L 指定了路径,但系统仍然会按照默认方式去存储库的标准位置(/lib 或者 /usr/lib)加载动态库,而不会在当前位置中查找,解决该问题有两种方式:1.将生成的动态库拷贝到 /usr/lib 下,再执行 gcc 命令;2.修改环境变量 LD_LIBRARY_PATH 来指定加载动态库的路径。
方式一:
在这里插入图片描述

后面两条命令将动态库 libfoo.so 移出来,并检查 /usr/lib 路径下不存在 libfoo.h。

方式二:
修改环境变量 LD_LIBRARY_PATH。
在这里插入图片描述

其中主要涉及到的命令有

export LD_LIBRARY_PATH=.    //添加环境变量(赋值运算符两边不要有空格)
echo $LD_LIBRARY_PATH       //查看环境变量的值
unset LD_LIBRARY_PATH       //删除环境变量

4.静态库与动态库的区别

首先利用相同的程序 add.c mul.c 生成 .o 文件,分别按之前的步骤生成静态库 libfoo1.a 和动态库 libfoo2.so,并将动态库 libfoo2.so 移动到 /usr/lib 下。然后,使用相同的 main.c 文件,利用 gcc 命令生成可执行文件 main1 (使用静态库 libfoo1.a 生成) main2 (使用动态库 libfoo2.so 生成),最后查看两个可执行文件的大小可以发现由静态库生成的可执行文件要比由动态库生成的可执行文件大。
在这里插入图片描述

原因是,静态库在链接时将用到的方法包含到最终的可执行文件中,而动态库不包含,只做标记,在程序运行时才动态加载,所以生成的可执行文件更小。由于上面这个原因,每个使用静态库的应用程序都需要拷贝静态库到可执行文件中,所以用静态库生成的可执行程序比较大,一旦链接完成,在执行程序的时候就不需要原来的静态库;而动态库在链接的时候并没有被拷贝到可执行文件中,只是做了标记,程序运行时才动态加载,因此可执行程序比较小,然而,程序运行时需要运行环境提供相应的动态库。
动态库相比于静态库的优点,使用动态库更有利于程序的更新与升级,不必重新编译整个可执行文件,只需要用新版本的动态库替换掉旧版本的动态库即可。


http://chatgpt.dhexx.cn/article/psZD7MPK.shtml

相关文章

【C++】静态库和动态库文件的生成和使用

前言 文章目录 前言库文件静态库的生成hello.hhello.cmain.c 动态库的生成GCC命令相同时,会先执行.a文件,还是会先执行.so文件?静态库与动态库的区别使用静态库的使用动态库的使用 总结 本文主要讲解了静态库和动态库的生成,以及.…

标准库文件

工艺库有db文件和lib文件,db是打不开的,lib是打得开的。 以反向器为例,时序弧上的延迟由两个因素影响,负载越大,延迟越大;输入转换时间越大,延迟越大。 随着工艺更加先进,线性模…

linux的库文件

文章参考链接:https://www.cnblogs.com/tankblog/p/6780146.html 一、什么是库文件? 本质上来说,库文件就是可执行代码的二进制形式,可以被操作系统载入内存中执行 Linux操作系统支持的函数库分为静态库和动态库,动态…

linux库文件

windows静态库文件扩展名.lib 动态库文件扩展名.dll linux 静态库.a 动态库.so 都是将函数封装在一起编译后供自己或他人调用,好处是编译后的库文件看不带源代码,可以保密 linux库文件一般存在 /lib 和/usr/lib 64位下也有可能存在 /usr/lib64 下…

Linux系统上库文件的生成与使用(静态库和动态库)

目录 1、什么是库文件? 2、静态库的生成与使用 2.1、生成 .o 文件 2.2、创建静态库 2.3、使用静态库 3、动态(共享)库的生成与使用 3.1、生成 .o 文件 3.2、生成动态库文件 3.3、使用动态库 4、静态库与动态库的区别 1、什么是库文…

库文件简述

什么是库文件? 库就是一组预先编译好的方法的集合。在linux系统中,库文件一般被存储在/lib和/usr/lib中,库的头文件一般会被存储在/usr/include下。 库文件可以分为静态库和共享库两种。 静态库的命名规则为libxxx.a,共享库的命名…

六、库文件

今天我们来了解一下库文件,主要有以下几个内容: 文章目录 一、库文件概念二、静态库(一)生成&&使用(二) 示例(三) 特点 三、动态库(一)生成&&am…

库文件

目录 库文件 静态库 动态库(共享库) 静态库和共享库的区别 库文件 库文件是预先编译好的方法的集合。 比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,而不需要重…

EDID 修改

EDID 128字节(不包括扩展),如果手动修改的话比较麻烦(最后一个字节校验和必须自己计算–128字节和为0),借助第三方工具比较好。 比如: SoftMCCS Phoenix EDID Designer EDIDManager EDIDViewer等。 如果只要修改制造商代号,…

EDID参数介绍

1、显示器的第24个字节是设置显示器的电源管理标准的。 各个位的作用如下,注意到标号为1的位是关于主画面。 3、Gamma源于CRT的响应曲线,即反映显像管的图像亮度与输入电子枪的信号电压的非线性关系的一个参数。对于CRT显示器而言,显像管电子…

EDID文件格式转换工具介绍

EDID文件格式转换工具介绍 1 EDID文件 简单来说,EDID文件主要内容就是128个字节数据(V1.3版本)或是256个字节数据(V1.4版本)。   但是不同的EDID的编辑工具支持的文件格式又不同,例如Phoenix EDID Desig…

EDID含义浅析

SoftMCCSEDID 开头(HEADER) 开头八个字节为EDID的开始标志,简称头,固定为:制造商和产品ID 这十个字节表示产品(MONITOR)ID和制造商信息。详细如下:EDID版…

display:dp:edid/e-edid/displayid

名词 EDID Extended Display Identification Data (Legacy VESA structure, superseded by the DisplayID structure).E-EDID Enhanced Extended Display Identification Data (Legacy VESA structure, superseded by the DisplayID structure).DisplayID Displa…

如何获取显示器的EDID信息

来源:http://wenku.baidu.com/view/8f82728471fe910ef12df8f4.html Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID…

HDMI之EDID使用说明

Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID打交道。EDID这东西很简单,但是如果不了解其基本原理和…

EDID基础

EDID EDID:Extended Display Identification Data (拓展显示标识数据)EDID是由VESA创造出来的,用于使显示器支持即插即用。 一般EDID存在于显示器的PROM或EEPROM内,一般如要读取EDID都是通过DDC EDID的作用主要是为了能让PC或其他的图像输…

EDID 解读

现在的显示设备比如显示器,电视等都HDMI接口,那通常每个HDMI接口都保留有一份EDID数据,这个数据可以存在程序里面由系统启动过程中来初始化,更常见的做法是每个HDMI口会有一个EEPROM来保存这份数据,这个EEPROM也只是有…

HDMI设计2----EDID and E-EDID

1,EDID是什么?有什么用? 图1 应用场景 如图1所示的应用场景,PC将视频信号发送 到我们的设备上,经过一系列的传输和切换,设备将视频信号发送到显示器或者投影机上,也就是说,我们的设备位于PC和显…

EDID 解析

1、显示器的第24个字节是设置显示器的电源管理标准的。 各个位的作用如下,注意到标号为1的位是关于主画面。 3、Gamma源于CRT的响应曲线,即反映显像管的图像亮度与输入电子枪的信号电压的非线性关系的一个参数。对于CRT显示器而言,显像管电子…

EDID标准简介

小伙伴们在设计显示接口的时候,常常会遇到显示器支持格式的问题,这里呢就简要的介绍下格式握手的重要协议EDID。 EDID(ExtendedDisplay Indentification Data Standard)就是显示器通过DDC(Display DataChannel&#xf…