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

article/2025/8/18 13:29:12

目录

1、什么是库文件?

2、静态库的生成与使用

2.1、生成 .o 文件

2.2、创建静态库

2.3、使用静态库

3、动态(共享)库的生成与使用

3.1、生成 .o 文件

3.2、生成动态库文件

3.3、使用动态库

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


1、什么是库文件?

        库是一组预先编译好的方法的集合,是计算机上的一类文件,提供给使用者一些开箱即用的变量、函数或类。库文件分为静态库动态库,静态库和动态库的区别体现在程序的链接阶段。
        一般来说,Windows静态库文件扩展名 .lib动态库文件扩展名 .dll (Dynamic-Link Libraries);Linux静态库扩展名.a动态库扩展名.so (Shared Object)。内容一样,都是将函数封装,编译后生成.o文件,将所有 .o 文件合并生成库文件,再将供自己或他人调用。好处在于编译后的库文件的源代码被加密,使用者看不到,可保密。
        Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。
        Linux库有两种,一种是静态库,其命令规则为 libxxx.a;一种是共享库,其命令规则为 libxxx.so

2、静态库的生成与使用

        静态库是.o 文件打包的结果,.o文件的数量可以是1个,也可以是多个。生成的过程需要使用 ar 工具来操作。

测试文件:

add.c:

max.c:

foo.h:

main.c:

2.1、生成 .o 文件

        使用命令gcc  -c  源文件序列

        命令的用法是多种多样的,可以分步经 预处理编译汇编 生成 .o 文件,也可以直接使用 gcc  -c  源文件名,一步生成 .o 文件。

        例如,使用命令 gcc  -c  add.c  max.c  ,一步生成两个文件的 .o 文件。

2.2、创建静态库

        使用命令ar  crv  lib库名.a  add.o  max.o

        例如,使用 ar  crv  libfoo.a  add.o  max.o,生成库名为libfoo.a,包含addmax两种方法的静态库。

        c 参数是创建库;r 参数是将方法添加到库中;v 参数显示详细过程。

2.3、使用静态库

        使用命令gcc  -o  main  main.c  -L  库文件所在路径  -l  库名

        在当前程序中使用静态库的方法,就是使用 gcc  -o  生成的可执行程序名  当前程序  -L  库文件所在路径  -l  库名

        ● -L  指定库文件所在路径 

        ● -l  指定库名(库名是libxxx.a中的xxx,无lib.a)

        例如,gcc  -o  main  main.c  -L  .  -l  foo,目标库文件就在当前目录下,所以路径为 . ,库文件名在去除lib.a后为 foo。

         此时,成功生成了可执行程序。

         执行程序后,发现程序结果符合预期,所以使用的库文件是正确的,并且成功使用了。

3、动态(共享)库的生成与使用

        动态库的测试文件除main程序外与静态库的测试文件相同:add.c、max.c、foo.h。

main.c:

3.1、生成 .o 文件

        gcc  -c  add.c  max.c

3.2、生成动态库文件

        使用命令gcc  -shared  -fPIC  -o  libfoo.so  add.o  max.o

        使用如上命令,就可以根据add.o和max.o文件,生成名为 libfoo.so 的动态库文件。

3.3、使用动态库

        使用命令gcc  -o  main  main.c  -L  .  -l  foo

        -L还是指定库文件所在路径,-l 指定库文件名。但是在命令使用前,我们需要了解一件事情,就是系统对动态库的链接,默认是在 /usr/lib 目录下的,意思就是就算此时我们指定了库文件所在路径,系统还是会去 /usr/lib 目录下寻找动态库文件。此时,有两种解决方案:

        1、将自制的动态库文件移动到 /usr/lib 目录下。

        此时,在使用动态库时就不用指定库文件所在路径了,但需要注意不能库文件名与 /usr/lib 目录下原有动态库文件重名

         此时,使用 gcc  -o  main  main.c  -l  foo 命令后,成功生成可执行文件。

         在执行文件后,程序结果正确,所以动态库生成与使用成功。

        2、修改环境变量,使可在当前目录下链接动态库。

        命令export  LD_LIBRARY_PATH=.

        设置该环境变量之后,系统在发现程序想要链接动态库时,就会默认先从当前路径寻找该动态库,找到后就链接;若没有找到就会返回到 /usr/lib 路径下寻找该动态库,找到后链接。若找遍所有位置都没找到,则报错。

        此时,设置环境变量后,先将动态库文件从 /usr/lib 目录下移动回来。

        再使用 gcc  -o  main  main.c  -L  .  -l  foo 命令,使用动态库。

         新生成的main可执行程序将原main程序覆盖。

         ./main程序执行正确,libfoo.so动态库文件使用成功。

        两个额外命令:删除指定环境变量:unset LD_LIBRARY_PATH;查看环境变量的值:echo $LD_LIBRARY_PATH。

3.4、查看可执行程序依赖的动态库

        命令:ldd  可执行程序名。

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

        每一个程序在使用静态库时,都会将静态库文件拷贝一份添加到自身。如果有多个程序都要使用该静态库文件时,都会给自身添加一份拷贝,这就导致会产生空间浪费。在源文件较少时不明显,但如果在一个项目中,静态库文件本身就比较大,并且使用该静态库文件的源程序很多,这就会造成大量内存浪费。

        而动态库文件在被使用时,会对所有想使用该动态库的源程序添加一个标记,在程序执行时再链接动态库文件使用。这就是动态库的优点,也是动态库被称为共享库的原因。


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

相关文章

库文件简述

什么是库文件? 库就是一组预先编译好的方法的集合。在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…

HDMI协议介绍(六)--EDID

目录 什么是EDID EDID结构 1)Header Information 头信息(厂商信息、EDID 版本等) (2)Basic Display Parameters and Features 基本显示参数(数字/模拟接口、屏幕尺寸、格式支持等) (3)色度信息 (4)Established Timings(VESA 定义的电脑使用 Timings) (5)Standard Timing…

EDID编辑器介绍

目录 1 EDID介绍2 DDC通道3 EDID编辑工具3.1 Phoenix EDID Designer3.2 Deltacast E-EDID Editor 4 EDID烧录工具 1 EDID介绍 EDID, Extended display identification data,中文名称扩展显示器识别数据,是VESA在制定DDC(Display Data Channel)显示器数据…

什么是EDID,EDID能做什么,EDID基本介绍

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

EDID使用说明

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

EDID解析

1 Instruction EDID: Extended Display Identification Data(扩展显示标识数据)是一种VESA (Video Electronics Standards Association)标准数据格式,其中包含有关显示器及其性能的参数,包括供应商信息、最…