linux 下的静态库与动态库

server/2024/11/14 8:52:45/

目录

一、介绍

1、静态库

2、动态库

二、操作

1、静态库

2、动态库

3、使用库文件

(1)方法一

(2)方法二

(3)方法三


一、介绍

1、静态库

        静态链接库实现链接操作的方式很简单,即程序文件中哪里用到了库文件中的功能模块,GCC 编译器就会将该模板代码直接复制到程序文件的适当位置,最终生成可执行文件。

        使用静态链接库生成的文件通常体积较大,但运行时不再依赖库文件,可以拷贝到别的设备上运行。

        在Linux中静态链接库文件的后缀名通常用 .a 表示;在Windows系统中,静态链接库文件的后缀名为 .lib。

2、动态库

        动态链接库,又称为共享链接库。和静态链接库不同,采用动态链接库实现链接操作时,程序文件中哪里需要库文件的功能模块,GCC 编译器不会直接将该功能模块的代码拷贝到文件中,而是将功能模块的位置信息记录到文件中,直接生成可执行文件。

        使用动态链接库生成的文件通常体积较小,但运行时依赖库文件

        在Linux中,动态链接库的后缀名通常用 .so 表示;在Windows系统中,动态链接库的后缀名为 .dll。

二、操作

1、静态库

        通常情况下GCC在编译过程中默认使用动态链接库,我们可以使用 -static 选项指定使用静态链接库。

        需要注意,库名格式为:libxxx.a

ar rcs 静态链接库名称 目标文件1 目标文件2 ...
# demo
gcc -c demo1.c -o demo1.o
gcc -c demo2.c -o demo2.o
# 生成静态库 demo.a 
ar rcs demo.a demo1.o demo2.i

2、动态库

        可将不包含 main 函数的一个或多个文件打包为动态库文件。

        需要注意,库名格式为:libxxx.so

# 若出错,可以将 -fpic 换位 -fPIC
gcc -fpic -shared 源文件名... -o 动态链接库名

3、使用库文件

        在Linux 中,库文件的搜索路径除了默认的搜索路径外(/lib 或 /lib64 或者 /usr/lib),还可通过三种方法来指定:

(1)方法一

        linux 主机下 /etc/ld.so.conf 配置文件中指定库文件搜索路径为:include ld.so.conf.d/*.conf

        我们可以在 /etc/ld.so.conf.d 文件夹下创建后缀为 conf 的配置文件,并将需要搜索的库文件路径添加进去。

        添加完后需要使用 ldconfig 刷新缓存。

        下面以 mariadb-x86_64.conf 为例,如下图所示:

(2)方法二

        通过环境变量 LD_LIBRARY_PATH 指定库文件搜索路径(临时的,只在当前shell下生效);

# 获取当前路径(绝对路径)
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
# 添加依赖搜索路径(当前路径下的 lib/linux_64 目录)
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${SHELL_FOLDER}/lib/linux_x64

(3)方法三

       在编译目标代码时指定该程序的库文件搜索路径。

       使用 gcc 或 g++ 时可以使用 -rpath 在生成的可执行文件中设置运行时库搜索路径,告知动态链接器在哪些目录下查找库文件。

       需要注意与 -L 参数进行区分:-L 参数只影响链接器在链接过程中查找库文件的路径,而 -rpath 参数影响动态链接器在程序运行时查找库文件的路径。

g++ -Wl,-rpath=/usr/local/lib/ -oevh libevent_http.cpp -levent

--------------------------------------------------------------

--------------------------------------------------------------

                  GPT生成的废话,混分用

--------------------------------------------------------------

--------------------------------------------------------------

动态库(Dynamic Link Library,简称DLL,在Linux/Unix系统中通常以.so后缀)与静态库(Static Library,在Unix-like系统中通常以.a后缀,Windows上则为.lib,但通常用于导入库)是程序开发中用于代码重用和模块化的两种重要方式。它们各自具有独特的特点和用法,下面将详细介绍两者之间的区别和联系。

动态库

定义与特点

  • 动态库是一个包含可由多个程序同时使用的代码和数据的库。这些代码和数据在程序运行时被加载到内存中,供程序调用。
  • 动态库允许不同的程序共享同一份库文件,从而节省磁盘空间和内存。
  • 由于动态库的内容不会直接包含在可执行文件中,因此使用动态库的程序在运行时需要能够找到并加载库文件。

编译与链接

  • 在编译阶段,编译器会为程序生成对动态库中函数的引用,而不是将函数的实际代码复制到可执行文件中。
  • 在链接阶段,链接器会处理这些引用,并生成一个包含必要信息的可执行文件,以便在运行时由动态链接器(如Windows上的Loader.exe或Linux上的ld.so)加载动态库。

运行时行为

  • 当程序运行时,动态链接器会查找并加载所需的动态库文件到内存中。
  • 程序通过动态链接器提供的接口调用动态库中的函数。
  • 如果动态库文件不存在或版本不兼容,程序可能无法正常运行。

优点与缺点

  • 优点:节省磁盘空间和内存(因为多个程序可以共享同一份库文件);便于更新和维护(只需更新库文件即可影响所有使用该库的程序)。
  • 缺点:存在依赖问题(程序需要找到并加载库文件才能运行);在某些情况下可能导致性能下降(因为存在额外的加载和解析时间)。

静态库

定义与特点

  • 静态库是在编译时将库中的代码和数据直接复制到可执行文件中的库。
  • 一旦静态库被链接到程序中,程序就可以在没有静态库文件的情况下独立运行。

编译与链接

  • 在编译阶段,程序员会编写源代码并生成对象文件(.o或.obj文件)。
  • 在链接阶段,链接器会将这些对象文件以及静态库中的代码和数据合并成一个可执行文件。

运行时行为

  • 由于静态库的内容已经被直接包含在可执行文件中,因此使用静态库的程序在运行时不需要再加载库文件。

优点与缺点

  • 优点:程序可以独立运行(不需要库文件);避免了动态链接的依赖问题。
  • 缺点:导致可执行文件体积增大(因为包含了静态库的全部内容);如果多个程序都使用了相同的静态库,则会造成代码冗余和磁盘空间的浪费;不利于库的更新和维护(因为需要重新编译和链接所有使用该库的程序)。

总结

动态库和静态库各有优缺点,选择哪种库取决于具体的应用场景和需求。在需要节省磁盘空间和内存、便于更新和维护的场景下,动态库是更好的选择;而在需要程序独立运行、避免依赖问题的场景下,静态库则更为合适。在实际开发中,可以根据项目的具体需求灵活选择使用动态库还是静态库。


http://www.ppmy.cn/server/121776.html

相关文章

JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码

🚀同城生活新风尚!一站式高效系统,让日常更便捷🛍️ 🍽️【开篇:同城生活,一触即发】🍽️ 在这个快节奏的时代,同城生活的便利性与效率成为了我们追求的新风尚。想象一下…

5个月的编程记录

不知不觉间,我已经在计算机这条道路上走过了五个月。从五个月前第一次翻开《C Primer Plus》开始,我便对编程产生了浓厚的兴趣。这门学科与我高中所学的死板知识截然不同,每个问题都有千变万化的解法,让我感到无比新鲜。 几天后&a…

Linux 简易shell编写

shell shell是壳,外壳的意思,一般我们使用linux系统有用图形化界面的也有使用命令行界面的,这两个都是一种shell,以命令行为例: 如图这个就是我这里的命令行格式,在$符后面写的就是执行的指令,…

数据结构栈——中缀表达式转后缀表达式

我们平常所用的标准四则运算表达式,如9(3-1)*310/2叫做中缀表达式,后缀表达式为9 3 1 - 3 * 10 2 / ,而后缀表达式更容易被计算机所理解计算,我们需要利用栈将中缀表达式转成后缀表达式。 规则:从左到右遍历中缀表达式…

毕设基于SSM+Vue3实现设备维修管理系统四:后台框架及基础增删改查功能实现

本章介绍后端基础框架及基础的增删改查功能实现,创建基础的dao、service即controller层相关的基类,并实现基础的增删改查相关功能。 源码下载:点击下载 讲解视频: SMMVUE3实现设备维修管理系统毕设:后端框架搭建及表外…

Vue 组件通信指南:Props 和 $emit,Vuex(状态管理),EventBus(事件总线),Provide/Inject(依赖注入)

引言 在 Vue 中,组件是构建应用的基本单元,而组件通信则是构建复杂应用的关键。组件通信是指在不同的 Vue 组件之间传递数据、交互和共享状态的过程,它在构建大型应用和组织代码方面起着至关重要的作用。 在开发过程中,我们经常…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代,智算中心作为人工智能和大数据技术的核心支撑设施,正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定,卓振思众动环监控应运而生,成为智算中心管理的重要组成部分…

显示屏显示缺陷检测系统源码分享

显示屏显示缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…