Linux——动态库和静态库

目录

前言

一.静态库

1.1生成静态库

1.2 库搜索路径

1.3 静态库优点

1.4 静态库缺点

二.动态库

2.1 生成动态库

2.2 使用动态库

2.3 运行动态库

2.4 动态库的优点

2.5  动态库的缺点

三.链接过程

四.如何创建和管理库

五.总结


前言

Linux系统中的库(Library)是一组可被多个程序共享的代码和数据的集合。库的主要目的是代码复用和模块化,它允许开发者在不同的程序中重复使用相同的代码,而不需要每次都重新编写。在Linux中,库主要分为两种类型:静态库(Static Libraries)动态库(Dynamic Libraries)。

一.静态库

  静态库在编译时被整合到最终的可执行文件中。这意味着当你链接一个静态库到你的程序时,库中的代码会被复制到最终的二进制文件里。静态库通常以.a(Archive)作为文件扩展名,例如libexample.a

1.1生成静态库

[root@localhost linux]# ls
add.c add.h main.c sub.c sub.h[root@localhost linux]# gcc -c add.c -o add.o
[root@localhost linux]# gcc -c sub.c -o sub.o
生成静态库[root@localhost linux]# ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表[root@localhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 sub.o
t:列出静态库中的文件
v:verbose 详细信息[root@localhost linux]# gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行。

1.2 库搜索路径

从左到右搜索-L指定的目录。
由环境变量指定的目录 (LIBRARY_PATH)
由系统指定的目录
/usr/lib
/usr/local/lib

1.3 静态库优点

  • 应用程序在运行时不依赖于库文件,因为代码已经被包含在内。
  • 通常在没有动态库支持的环境中(如某些嵌入式系统)更容易使用。
  • 程序的分发更为简单,因为不需要附带额外的库文件。

1.4 静态库缺点

  • 静态库的代码会被复制到每个使用它的程序中,这可能导致磁盘空间和内存的浪费。
  • 更新静态库时,所有使用该库的程序都需要重新编译。

二.动态库

动态库在程序运行时被加载。与静态库不同,动态库的代码不会被复制到每个程序中,而是在程序运行时从库文件中加载。动态库通常以.so(Shared Object)作为文件扩展名,例如libexample.so

2.1 生成动态库

shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so

[root@localhost linux]# gcc -fPIC -c sub.c add.c [root@localhost linux]# gcc -shared -o libmymath.so *.o [root@localhost linux]# ls add.c add.h add.o libmymath.so main.c sub.c sub.h sub.o

2.2 使用动态库

编译选项
l:链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.

gcc main.o -o main –L. -lhello

2.3 运行动态库

1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib
2、更改 LD_LIBRARY_PATH

[root@localhost linux]# export LD_LIBRARY_PATH=.[root@localhost linux]# gcc main.c -lmymath[root@localhost linux]# ./a.outadd(10, 20)=30
sub(100, 20)=80

3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

[root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf/root/tools/linux[root@localhost linux]# ldconfig

2.4 动态库的优点

  • 节省磁盘空间和内存,因为多个程序可以共享同一份库文件。
  • 更新动态库时,只需替换库文件本身,而不需要重新编译所有依赖它的程序。
  • 动态链接可以在运行时解决库的版本冲突问题。

2.5  动态库的缺点

  • 程序在运行时需要库文件,这意味着分发时需要确保库文件的存在。
  • 如果库文件损坏或者不兼容,程序可能无法运行。

三.链接过程

在Linux中,链接过程分为两个阶段:编译(Compilation)和链接(Linking)。

  1. 编译:将源代码(如C或C++代码)编译成目标文件(通常是.o文件)。
  2. 链接:将目标文件与库文件链接在一起,生成最终的可执行文件。

对于静态库,链接发生在编译阶段,而动态库的链接则发生在程序运行时。

四.如何创建和管理库

创建静态库和动态库通常涉及到使用编译器(如GCC)的特定选项。

例如,创建动态库时,你可能需要使用-shared选项,而创建静态库则不需要。

管理库通常涉及到使用ldconfig命令,它可以更新系统的库缓存,确保ld.so(动态链接器)能够找到并加载正确的库文件。

五.总结

静态库和动态库各有优缺点,选择使用哪一种通常取决于具体的应用场景和需求。

静态库适合于不需要频繁更新和分发简单的应用程序,而动态库则更适合于需要节省空间、易于更新和维护的大型应用程序。

在实际开发中,开发者可能会根据项目的特点和部署环境来决定使用哪种类型的库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux】linux系统调用及文件IO操作

一、系统调用 1、概述 系统调用: 就是操作系统内核 提供给用户可以操作内核 一组函数接口。用户 借助 系统调用 操作内核。比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时…

golang关键字channel介绍

Golang 关键字 channel 的用法和原理 Golang 是一门支持并发编程的语言,它提供了一种特殊的类型:channel,用于在不同的 goroutine 之间传递数据,实现同步和通信。channel 是 Go 语言高性能并发编程中的核心数据结构和机制。本文将…

如何创建测试计划?这些要考虑到

以下为作者观点: 创建一个彻底和有效的测试计划对软件测试的成功至关重要。它可以帮助识别过程中可能出现的潜在问题或问题。 什么是测试计划? 测试计划是一份文件,概述了软件测试过程的策略、目标、资源和时间表。测试计划通常包括一些细…

Golang 锁介绍

在并发编程中,锁是一种常用的同步机制,用来保护共享资源的安全访问和修改。Golang 作为一门支持并发的语言,提供了两种主要的锁类型:互斥锁(Mutex)和读写锁(RWMutex)。本文将介绍这两…

uniapp 项目 浏览器chrome使用vue devtool 识别不了 in not detect

问题 uniapp的项目,vue2, chrome 分析 添加了运行时,指定模板h5.html 指定的h5.html重置了运行根目录,导致了vue dev tool在运行时,chrome上识别不了。 解决: 方法1: 只能调试的时候,不加sati…

java常用应用程序编程接口(API)——Arrays概述

前言: 学到Arrays了,整理下心得。打好基础,daydayup! Arrays 用来操作数组的一个工具类 Arrays的常见方法 方法名说明public static String toString(类型[] arr)返回数组的内容public static int[ ] copyOfRange(类型[ ] arr,启示索引&…

【操作系统学习笔记】文件管理1.1

【操作系统学习笔记】文件管理1.1 参考书籍: 王道考研 视频地址: Bilibili I/O 设备的基本概念与分类 I/O 设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件设备。UNIX系统将外部设备抽象为一种特殊的文件&a…

2021 年 6 月青少年软编等考 C 语言一级真题解析

目录 T1. 数的输入和输出思路分析 T2. (a / b) c 的值思路分析 T3. 大写字母的判断思路分析 T4. 特殊求和思路分析 T5. 硬币翻转思路分析 T1. 数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留 2 2 2 位小数输出,然后输出整数。 时间限制&…

SpringMVC框架①

目录 一、SpringMVC概述 1. 什么是MVC 2. 什么是SpringMVC 3. springMVC特点 二、HellWorld 1. 开发环境 2. 创建maven工程 3. 配置web.xml 4. 创建请求控制器 5. 创建springMVC的配置文件 6. 测试HelloWorld 三、RequestMapping注解 1、RequestMapping功能 2、Re…

Android如何实现复制到剪贴板

文章目录 核心代码关于权限举例 在 Android 开发中,可以使用 ClipboardManager 来复制文本到剪贴板。以下是一个简单的示例代码,演示如何将文本复制到剪贴板: 核心代码 // 获取剪贴板管理器 val clipboardManager getSystemService(Contex…

Linux - 安装 maven(详细教程)

目录 一、下载二、安装三、配置环境变量四、镜像资源配置 一、下载 官网:https://maven.apache.org/download.cgi 打开 maven 的官网下载页面,点击 bin.tar.gz 文件链接 即可下载最新版本的 maven 如果想要下载旧版本的 meven,则点击 Maven…

图形系统开发实战课程:进阶篇(上)——9.空间算法(一)

图形开发学院|GraphAnyWhere 课程名称:图形系统开发实战课程:进阶篇(上)课程章节:“图形样式”原文地址:https://www.graphanywhere.com/graph/advanced/2-9.html 第九章 空间算法(一) \quad 在…

SpringBoot 自定义映射规则resultMap collection一对多

介绍 collection是封装一对多关系的,通常情况下是一个列表,association是一对一,通常情况是一个对象。例如:查询班级下所有的学生,一个班级可以有多个学生,这就是一对多。 案例 有一个学生表&#xff0c…

基于 Redis 的 JWT令牌失效方案

应用场景 当用户登录状态到登出状态时,对应的JWT的令牌需要设置为失效状态,这时可以使用基于 Redis 的黑名单方案来实现JWT令牌失效。 基于 Redis 的黑名单方案 当用户需要登出系统时,将用户携带的Token进行解析,解码出JWT令牌…

Go语言中的时间控制:定时器技术详细指南

Go语言中的时间控制:定时器技术详细指南 引言定时器基础创建和使用time.Timer使用time.Ticker实现周期性任务定时器的内部机制小结 使用time.Timer实现简单的定时任务创建和启动定时器停止和重置定时器定时器的实际应用小结 利用time.Ticker处理重复的定时任务创建和…

这里推荐一款unity3d人物动物控制器详细的等学会再写文章

unity3d Animal Controller 1.4.0a 动物NPC行为控制器 动物控制器(AC)是一个基于脚本架构的动画框架控制器。它适用于任何动物或人形角色的根运动或原地动画。 人和动物的各种动作都有; 小白必选、 我只是运行乐demo就感觉牛 demo路径:Asset…

Python不换行print在终端中不显示

问题描述 当使用不换行 print 即 print(‘test, end) 后立即关闭标准输出 sys.stdout open(os.devnull, w)则 print 的内容不会显示在正常的终端上(例外是 PyCharm 中的终端能够正常显示)。 复现问题 复现该问题的简易代码: import sys,…

基于pytorch的手写体识别

一、环境搭建 链接: python与深度学习——基础环境搭建 二、数据集准备 本次实验用的是MINIST数据集,利用MINIST数据集进行卷积神经网络的学习,就类似于学习单片机的点灯实验,学习一门机器语言输出hello world。MINIST数据集,可以…

【go从入门到精通】go环境安装和第一个经典程序

go下载和环境变量配置 下载地址 Go官网下载地址:https://golang.org/dl/All releases - The Go Programming Languagehttps://golang.org/dl/ 然后根据自己的系统环境来选择不同的安装包下载,下面我分别针对不同环境进行说明(大家可以根据自…

计算机网络中常用的命令

Ping 通过发送一系列的ICMP回送数据报来确定本机与目的主机是否可以正常通信。输出中TTL代表ICMP报文存活时间,可以推算报文经过了几个路由器。ping失败有可能是由于Windows防火墙-IPv4回显请求没有开启。Ipconfig 获取主机的网络配置信息,例如IP地址、子…