【Linux基础】静态库和共享库(如何自定义库文件?)

article/2025/8/18 5:50:00

文章目录

  • 前言
  • 一、库文件的基本知识
    • 1.库文件分类
    • 2.库文件命名
  • 二、如何自定义静态库?
    • 1.静态库简介
    • 2.具体流程(详细步骤)
    • 3.静态库缺点
  • 三、如何自定义共享库?
    • 1.共享库简介
    • 2.具体流程(详细步骤)
    • 3.共享库优点
  • 四、静态库与共享库区别
    • 1.代码被载入时刻不同
    • 2.实例分析——应用程序使用静态库和共享库的区别
  • 总结


前言

   Linux系统下的库文件是一组预先编译好的函数的集合,用以执行某项常见的任务。在/lib/usr/lib目录下,存储着Linux系统大部分的标准库文件。但是,当Linux目录下的标准库文件无法满足我们的要求时,就需要我们自定义库文件(静态库或共享库)。
   本篇,我们将详细介绍如何自定义静态库和共享库,以及两者之间的区别。

一、库文件的基本知识

1.库文件分类

  • 库文件通常以静态库共享库两种格式存在。

2.库文件命名

  • 库文件的文件名以lib开头,随后跟着库名,最后以库文件的类型结尾。

  • 库文件命名实例:libname.alibname.so

  • 注:.a代表传统的静态函数库,.so代表共享函数库。

二、如何自定义静态库?

1.静态库简介

   静态库是一组处于“准备好使用”的目标文件。当程序需要使用函数库中的某个函数时,只需包含一个声明该函数的头文件。编译器和链接器负责将程序代码和函数库结合在一起,组成一个单独的可执行文件。

静态库也称为归档文件(archive),以.a作为文件后缀,可用ar命令创建和维护静态库。

2.具体流程(详细步骤)

(1)首先,我们在Linux系统下使用gedit编辑工具,写下了三个代码文件,如下图所示。

在这里插入图片描述
(2)其次,我们使用终端命令,将代码文件编译成目标文件。

终端命令:gcc -c hello.c(注:-c 选项,只进行预处理、编译和汇编,不进行链接,生成.o 文件)。

(3)接着,通过ar指令打包成.a后缀的静态库。

终端命令:ar -crv libMyhello.a hello.o(注:-c 选项,创建静态库文件;-r 选项,向存档文件中插入.o文件,替换已有的任何同名文件,新成员添加到文档末尾;-v 选项,显示详细信息 )。

(4)最后,使用静态库进行编译,生成可执行文件。

终端命令:gcc -o main.c main -L./ -lMyhello(注:-L 选项,增加库的搜索路径;-lname,要搜索的库文件)。

   注意事项:打包成静态库时,文件名必须为lib+name+.a(name为静态库名)。

3.静态库缺点

   当同时运行许多应用程序,并且他们都使用同一个函数库的函数时,内存中就会有同一函数的多个副本,而且在程序文件自身中也有多份同样的副本,这将消耗大量的内存和磁盘空间
   为了避免静态库的缺点,我们可以选择使用共享库来实现函数的动态链接。

三、如何自定义共享库?

1.共享库简介

   共享库的保存位置和静态库一样,但共享库有不同的文件名和后缀(.so)。使用共享库的链接方式,能够使程序本身不再包含函数代码,而是直接引用 运行时可访问的共享代码。
   当编译好的程序被装载到内存中执行时,函数引用被解析,并产生对共享库的调用。只有在共享库需要被调用的时候,共享库才被加载到内存中

2.具体流程(详细步骤)

(1)首先,我们同样在Linux系统下使用gedit编辑工具,写下了三个代码文件,如下图所示。

在这里插入图片描述

(2)其次,我们将代码文件编译成目标文件。不同于静态库的是加入了-fPIC选项。

终端命令:gcc -fPIC -c hello.c(注:-fPIC 选项,生成位置独立的目标代码)。

(3)然后,我们输入终端命令,生成共享库。

终端命令:gcc -shared -o libMyhello.so hello.o(注:-shared 选项,进行动态编译,生成共享库文件)。

(4)接着,我们使用共享库进行编译,生成可执行文件。

终端命令:gcc main.c -L./ -lMyhello(注:-L 选项,增加库的搜索路径;-lname,要搜索的库文件)

(5)最后,我们需要将动态库拷贝到系统库目录/lib/usr/lib中,否则可执行文件找不到共享库无法运行。

终端命令:cp libMyhello.so usr/lib

   注意:步骤(2)和(3)可直接用终端命令:gcc -fPIC -shared -o libMyhello.so hello.c,若只执行步骤(1)-(4),将无法运行生成的可执行文件。

3.共享库优点

  • 共享库的更新,可以独立于依赖它的应用程序。
  • 系统可以只保留共享库的一份副本供许多应用程序同时使用,并在磁盘上也仅保存一份。

四、静态库与共享库区别

1.代码被载入时刻不同

  • 静态库:在编译时会被链接到目标代码中,程序运行时不再需要静态库,因此代码体积较大。
  • 共享库:在编译时不会链接到目标代码中,而是在程序运行时才载入,因此代码体积较小。

2.实例分析——应用程序使用静态库和共享库的区别

   若一款游戏源码采用静态库链接,当游戏需要更新时,需要重新下载整个游戏,不仅下载安装包大,耗费时间长,而且十分影响游戏体验。
   若游戏源码采用共享库链接,当游戏需要更新时,我们只需更新游戏源码依赖的共享库,即下载该游戏的补丁包,无需重新下载整个游戏


总结

   以上就是关于如何自定义静态库和共享库的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!


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

相关文章

Linux 系统上的库文件生成与使用

1.库文件 库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。 库有两种,一种是静态库,其…

库文件、静态库(lib)与动态库(dll)的生成与使用

静态库 程序编译一般需经预处理、编译、汇编和链接几个步骤。在应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库…

库文件的生成和使用

一、库文件 库是一组预先编译好的函数方法的集合 Linux上库文件的存放位置: /lib和/usr/lib 库分为两种:静态库和共享库 Linux上静态库标识(libxxx.a),共享库(libxxx.so) Windows上静态库标识(.lib)&a…

3、库文件

1、什么式库文件: 库文件是预先编译好的方法的集合。(相当于一大堆的可执行文件) 存放头文件的标准目录:/usr/include 存放库文件的标准目录:/usr/lib 比如: printf函数的实现在库文件中 libcs.so 声明在/usr/inc…

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

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

【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这东西很简单,但是如果不了解其基本原理和…