当前位置: 首页 > 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下的二…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...