当前位置: 首页 > news >正文

【Linux】如何打包成动静态库,第三方动静态库如何使用?

文章目录

    • 1. 打包成静态库
    • 2. 打包成动态库(共享库)
    • 3. 使用第三方静态库
    • 4. 使用第三方动态库
  • 5. 动态库的加载
  • 6. 注意事项


库的名称:去掉前面的 lib 去掉后面的 .a(版本号) .so(版本号) 剩下的,才是库正真的名称。

查看文件依赖库:ldd


1. 打包成静态库

ar -rc [lib库的名称.a] [需要打包的.o文件]

r : replace (更新替换)

c:create (建立)


2. 打包成动态库(共享库)

  1. 使用 gcc -fPIC 创建 .o 文件
  • (PIC)position ignoring code 与位置无关码
gcc -fPIC -c [.c文件]
  1. gcc -shared 打包 .o 文件
  • -shared 共享库 / 动态库
gcc -shared -o [lib动态库名.so] [需要打包的.o文件]

3. 使用第三方静态库

当我们有了一个库,接下来,要将库引入我们的项目,必须要让编译器找到 库 和 头文件

  • 需要指定的 头文件 和 库文件
  • 如果没有默认安装到系统 gcc、g++ 默认的搜索路径下,用户必须指明对应的选项,告知编译器:
    • 头文件在哪里
    • 库文件在哪里
    • 库文件具体是谁
  • 如果我们下载下来的库和头文件,拷贝到系统默认路径下,就叫做,在 Linux 下安装库
  • 如果我们安装的库是第三方的(语言、操作系统系统接口就是第一方和第二方)库,我们要正要使用,即使是全部都安装到了系统中,gcc 和 g++ 都必须使用 -l 来指明具体库的名称
gcc -o mytest main.c -I[头文件的路径] -L[库的路径] -l[去头尾的库名]

-L:后接 的路径(可以用 . ..),可以带空格也可以不带空格,
-I:后接 头文件 的路径(可以用 . ..),可以带空格也可以不带空格,
-l:后接 链接的 库名(去头去尾),可以带空格也可以不带空格

注意:静态链接形成的可执行程序,本身就有静态库中对方法的实现。 也就是说使用静态链接注定 会占用更多的资源。占用哪些资源呢?磁盘、可执行程序体积变大加载占用内存、下载周期变长、占用网络资源


4. 使用第三方动态库

使用静态库的方法,让我们把路径和名称给了编译器,OS 可以通过链接原则,即,将用户使用的二进制代码直接拷贝到目标可执行程序中。

但动态库不是这样的。还需要将 .so 文件放到系统的默认路径下,才能被 OS 找到。

运行时,OS 查到动态库的方法:

  1. 环境变量:向 LD_LIBRARY_PATH 中添加库所在的路径
    这是一个临时方案,此方法重启机器就无效了

  2. /lib64//user/lib64 下创建第三方库的 软链接

sudo ln -s [被链接路径] /lib64/[库名]
  1. 在系统路径 /etc/ld.so.conf.d/添加配置文件,写入 第三方库的路径
# 1. 在对应系统路径下添加一个配置文件
sudo touch /etc/ld.so.conf.d/[myconf.conf]# 2. 将第三方库的所在位置,添加到文件中
sudo vim /etc/ld.so.conf.d/[myconf.conf]# 3. 让 ld 路径下的系统配置文件生效
sudo ldconfig

5. 动态库的加载

只要我们把库加载到了内存,映射到进程的地址空间(共享区)中之后,我们的代码执行库中的方法时,就依旧还是在自己的地址空间内进行函数跳转即可。

不管有多少进程,动态库只会加载一份,是很节省资源的。

库中的地址,怎么理解?

动态库必定面临一个问题:
不同的进程,运行程度不同,需要使用的第三库是不同的,注定了,每一个进程的共享区中空闲的位置是不确定的。动态库中的地址,是不能确定的,所以使用库时绝对不能使用绝对地址。

动态库中的所有地址都是偏移量,默认从 0 开始。

当一个库,真正的被映射进地址空间的时候,它的起始地址才能真正确定。所以我们调用动态库的时候,选取地址的方法是:该进制中这个库真正的起始地址 + 调用方法的偏移量。如此一来,库就可以在进程的地址空间中随便加载,与我们具体加载到地址空间的什么位置就毫无关系了。

6. 注意事项

  1. 动态库和静态库同时存在时,系统默认采用动态链接

需要连接静态则,需要给出参数 -static

gcc -o mytest main.c -I[头文件的路径] -L[库的路径] -l[去头尾的库名] -static
  1. 编译器,在链接的时候,如果提供的库既有动态又有静态,优先采用动态链接。如果只有静态的话,直接静态链接。

  2. 静态的库删了不影响可执行程序运行,而动态的少了就不能跑了。

  3. 云服务器一般只有动态库,静态库需要自己安装

c 的静态库

sudo yum install -y glibc-static

c++ 的静态库

sudo yum install -y libstdc++-static

相关文章:

【Linux】如何打包成动静态库,第三方动静态库如何使用?

文章目录 1. 打包成静态库2. 打包成动态库(共享库)3. 使用第三方静态库4. 使用第三方动态库 5. 动态库的加载6. 注意事项 库的名称:去掉前面的 lib 去掉后面的 .a(版本号) .so(版本号) 剩下的,才是库正真的名称。 查看文件依赖库…...

SAP MM学习笔记20- SAP中的英文2 - SD中英文,日语,中文

SD模块中的英文,日语,中文 对照。 販売管理 日本語英語中国語受注伝票sales order销售订单出荷伝票delivery order交货订单ピッキングリストpicking list领货清单シップメント伝票shipment document发运单据出庫確認post goods issue发货确认請求伝票b…...

计算机网络中的一些基本概念

IP地址: 址用于定位主机的网络地址。是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节).**端口号:**在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单…...

pytest 用例运行方式

一、命令行方式运行 执行某个目录下所有的用例,符合规范的所有用例 进入到对应的目录,直接执行pytest; 例如需要执行testcases 下的所有用例; 可以进入testcases 目录; 然后执行pytest 进入对应目录的上级目录,执行pytest 目录名称/ ; ; 例如需要执行testcases 下…...

简单入门seleniumUI自动化测试

目录 一、selenium的介绍 二、selenium的原理 三、selenium的八种元素定位的方法 1、ID定位: 2 、name定位: 3、class定位: 4、tag定位: 5、link_text定位: 6、partial_link_text定位: 7、css定位…...

Excel(1):表头或列头冻结

1.需求 对于较大的excel,通常需要固定一部分内容,另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格,需要注意的是,选择冻结窗格时,窗格的左上方的表格区域是固定不动的,只可以向下或者向右活动。...

通达OA SQL注入漏洞【CVE-2023-4166】

通达OA SQL注入漏洞【CVE-2023-4166】 一、产品简介二、漏洞概述三、影响范围四、复现环境POC小龙POC检测工具: 五、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损…...

全网最细,Python接口自动化测试-Session会话保持(实战详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在接口测试的过程…...

Java项目初始化ES、MYSQL表结构及表数据

一、初始化MYSQL数据 public boolean initMysql() throws Exception {log.info("initMysql.start");//获取所连接的数据库名称String database systemMapper.getDatabase();if (StringUtils.isBlank(database)) {throw new BusinessException("连接数据库失败,…...

2023-08-13力扣每日一题

链接&#xff1a; 88. 合并两个有序数组 题意&#xff1a; 如题 解&#xff1a; 从后往前&#xff08;从大到小&#xff09;插入排序&#xff0c;这样就不会影响原先的有序性 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; void merge(vector…...

下一代深度学习的思考与若干问题

下一代深度学习的思考和若干问题...

【Linux】IP协议——网络层

目录 IP协议 基本概念 IP协议格式 分片与组装 网段划分 特殊的IP地址 IP地址的数量限制 私网IP地址和公网IP地址 路由 路由表生成算法 IP协议 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;IP协议是TCP/IP体系中的网络层协议…...

【CSS学习笔记】

学习内容 1.css是什么 2.CSS怎么用&#xff08;快速入门&#xff09; 3.CSS选择器&#xff08;重点 难点&#xff09; 4.美化页面&#xff08;文字、阴影、超链接、列表、渐变…&#xff09; 5.盒子模型 6.浮动 7.定位 8.网页动画&#xff08;特效&#xff09; 1.什么是CSS C…...

2023-arxiv-LLaMA: Open and Efficient Foundation Language Models

开放和高效的基础语言模型 Paper&#xff1a;https://arxiv.org/abs/2302.13971 Code: https://github.com/facebookresearch/llama 摘要 本文介绍了 LLaMA&#xff0c;这是⼀个包含 7B 到 65B 参数的基础语⾔模型的集合。作者在数万亿个令牌上训练模型&#xff0c;并表明可以…...

Ctfshow web入门 XXE 模板注入篇 web373-web378 详细题解 全

CTFshow XXE web373 学习资料&#xff1a; &#xff08;梭哈~&#xff09; https://www.cnblogs.com/20175211lyz/p/11413335.html https://www.cnblogs.com/zhaijiahui/p/9147595.html https://www.cnblogs.com/r00tuser/p/7255939.html https://mp.weixin.qq.com/s?__bizMz…...

小内存嵌入式设备软件的差分升级设计(学习)

摘要 提出一种改进HDiffPatch算法并在复旦微单片机上实现小内存差分升级的方案&#xff0c;即使用单片机内的Flash空间替代算法占用的RAM空间&#xff0c;从而减少算法对单片机RAM空间的需求&#xff0c;以满足小内存微处理器的差分升级&#xff0c;同时对算法内存分配释放函数…...

小程序具体开发

window 导航栏 属性名类型默认值作用navigationBarTitleText string字字符串导航栏标题内容navigationBarBackgroundColorHexcolor#000000设置导航栏背景颜色&#xff08;比如荧黄色 #ffa&#xff09;navigationBarTextStylestringwhite设置导航栏标题的颜色&#xff08;仅含有…...

《TCP IP网络编程》第十六章

第 16 章 关于 I/O 流分离的其他内容 16.1 分离 I/O 流 「分离 I/O 流」是一种常用表达。有 I/O 工具可区分二者&#xff0c;无论采用哪种方法&#xff0c;都可以认为是分离了 I/O 流。 2次 I/O 流分离&#xff1a; 第一种是第 10 章的「TCP I/O 过程」分离。通 shutdown(soc…...

HTML5 基础标签

目录 前言 标题标签 段落标签 换行标签和水平线标签 文本格式化标签 图像标签 超链接标签 多媒体标签 列表标签 无序列表 有序列表 表格 合并单元格 表单 无语义的布局标签 字符实体 前言 当今互联网时代&#xff0c;网页是我们获取信息、交流和展示自己的重要渠…...

二、Qt的安装(Linux系统下安装Qt6过程)

一、Qt资源下载网址 网址&#xff1a;点击下载http://download.qt.io/ 下载&#xff1a;点击下载(CSDN) 二、下载二进制安装包 进入Qt资源下载网址&#xff0c;进入对应的资源目录&#xff0c;找对应系统平台的二进制安装包选择进行下载&#xff0c;在这这里我们选择Linux下的二…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...