3、Linux库的生成和使用(核心代码是程序员不可公开的小秘密)

news2024/11/18 18:44:03

目录

Linux库的概念

Linux 静态库

Linux 静态库作用

Linux 静态库的创建

1. 将.c文件生成.o文件

​编辑

2. 将所有的.o文件归档为一个静态库.a文件

Linux 静态库的使用

Linux 动态库:

Linux 动态库作用

Linux 动态库的创建

生成.so动态库文件

​编辑

Linux 动态库的使用

!!执行出错!!​编辑

解决办法

1、将生成的动态库拷贝到 /usr/lib 中

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径

总结


Linux库的概念

Linux静态库和动态库都是可重用的二进制代码块,它们可以使程序的编写更加高效和简洁

静态库会被编译并包含在程序中,因此当程序运行时,不需要外部依赖(在程序编译前就加入到目标程序中,而动态库会在运行时加载,因此多个程序可以共享同一个库,从而节省内存(在程序执行时动态地由目标程序去调用)。

Linux 静态库

Linux静态库是一种可重用的二进制代码块,它是链接到包含它的程序的一部分,因此当该程序运行时,不需要外部依赖。静态库的文件扩展名为“.a”,通常由一系列编译后的.obj或.o文件组成。

Linux 静态库作用

1. 简化代码的维护和升级:通过将常用的功能放在一个独立的库中,可以方便地维护和升级整个程序集。
2. 提高代码的安全性:静态库被完全集成到应用程序中,使得程序在没有网络连接的情况下也能正常运行,从而提高了代码的安全性。
3. 减少内存占用:由于静态库在编译时就被链接到程序中,所以不必担心重复加载,从而减少了内存占用。
4. 不受版本控制影响:因为静态库已经被完全包含在程序内部,所以不受其他程序的版本控制影响。

Linux 静态库的创建

在Linux环境中,可以通过以下步骤创建静态库:

1. 将.c文件生成.o文件

使用gcc编译器或其他合适的编译器,将所有要包含在库中的源代码文件编译成.o文件。

生成.o文件
gcc -c 文件名.c 

 继续使用上一小节工厂模式的代码将cat.c dog.c person.c 生成对应的.o文件

 

2. 将所有的.o文件归档为一个静态库.a文件

运行ar命令,将所有的.o文件归档为一个静态库文件(ar 指令是一个Unix/Linux系统中的档案管理工具,主要用于管理和处理备存文件(archive))

将.o文件生成.a静态库文件

ar rcs lib+要生成静态库的名字.a *.o 

//lib是library(库)的缩写
//*.o中“ * ”是通配符,表示该文件夹中的所有.o文件
//ar 命令中的 rcs 是 -rcs 参数组合的一个简写形式,分别代表以下几个动作:
    -r:追加档案到归档文件。
    -c:创建归档文件。如果指定的目标文件已经存在,则清空后再进行操作。
    -s:排序归档文件内的成员。
综合起来,-rcs 参数就是追加、清除及排序的意思。这意味着,如果你有一个已经存在的归档文件,你想向里面添加一些新的档案,那么应该使用 -rcs 参数,这样可以确保归档文件中的成员按照正确顺序排列。

 成功生成了名为libfactory.a的静态库文件

Linux 静态库的使用

在创建完静态库后,就可以在其他程序中使用它了。

这时我们可以删除(rm)/移动(mv)功能函数以及第一步生成的.o文件,只留下头文件、主函数和生成的静态库

在编译时,只需将库添加到链接器命令中

gcc 文件名.c -L./ -l静态库名(砍头去尾) -o 可执行文件名字

//砍头去尾是意思是:我们生成静态库名字是 libfactory.a,
使用-l链接的时候只需-lfactory即可,去掉lib和.a

不加-L ./会报错,因为-l链接的库默认在/usr/lib /usr/local/lib下面寻找,加上-L ./后告诉编译器在当前目录下寻找这个库,因为这个静态库是我们自己生成的

运行效果

Linux 动态库:

Linux动态库是一种共享的、可执行的二进制代码块,它在程序运行时被装载到内存中,因此它可以被多个进程同时使用,节省了内存资源。动态库的文件扩展名为“.so”,即Shared Object(共享对象)的缩写。

Linux 动态库作用

1. 节省空间:由于多个程序可以共享一个动态库,因此可以节省磁盘空间和内存。
2. 改进性能:动态库只在程序真正需要时才被载入内存,这样可以提高系统的整体性能。
3. 更新灵活:动态库可以单独更新而不必重新编译整个程序。
4. 提供更强的灵活性:动态库可以随时安装和卸载,无需重新编译程序。

Linux 动态库的创建

在Linux环境中,可以通过以下步骤创建动态库:

生成.so动态库文件

生成.so动态库文件
gcc -shared -fpic 文件名.c -o lib名字.so

//-shared 选项告诉 GCC 在生成目标文件时产生共享库(也就是动态链接库)。这表示你的程序可以动态链接到其他程序中,因此无需在运行时每次都加载整个库文件,而是只加载必要的部分。
//-fpic 是 Position Independent Code 的缩写,意为位置无关代码,它会让 GCC 在编译目标文件时创建一个独立于内存位置的代码,这样就可以在程序运行时改变动态库的内存位置。

Linux 动态库的使用

在创建完动态库后,就可以在其他程序中使用它了。

这时我们可以删除(rm)/移动(mv)功能函数以及第一步生成的.o文件,只留下头文件、主函数和生成的动态库

在编译时,只需将库添加到链接器命令

gcc 文件名.c -L./ -l动态库名(砍头去尾) -o 可执行文件名字

//砍头去尾是意思是:我们生成静态库名字是 libfactory.so,
使用-l链接的时候只需-lfactory即可,去掉lib和.so

不加-L ./会报错,因为-l链接的库默认在/usr/lib /usr/local/lib下面寻找,加上-L ./后告诉编译器在当前目录下寻找这个库,因为这个静态库是我们自己生成的

!!执行出错!!

 静态库编译后可以直接运行可执行文件但是动态库不可以:静态库会被编译并包含在程序中,因此当程序运行时,不需要外部依赖(在程序编译前就加入到目标程序中,而动态库会在运行时加载,(在程序执行时动态地由目标程序去调用,程序执行的时候才去寻找动态库)。

解决办法

1、将生成的动态库拷贝到 /usr/lib 中

 删除 /usr/lib 下的动态库方便验证法2

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径

export LD_LIBRARY_PATH="生成的动态库所在的文件夹路径"

树莓派中但这个命令是临时的只限于运行这个命令的窗口,换一个窗口就不行了(虚拟机不会)

写一个shell脚本解决这个问题

总结

静态库的优点在于它们不需要在运行时存在,而动态库需要在运行时可用,否则程序将无法启动。但另一方面,静态库会增加最终程序的大小,因为它们的代码被嵌入到了程序中,而动态库则是只在运行时加载,从而减小了程序的大小。此外,静态库比动态库更容易安全审计,因为它们是完全内置到程序中的。 总的来说,静态库适合于那些只需要少量更改并且不需要频繁更新的代码模块,而对于需要经常更新和更改的模块更适合使用动态库

动态链接库(Dynamic Link Library,也称作 Shared Library 或 Shared Object)在运行时才被加载到内存中,它的好处是可以被多个程序共享,只需要一份物理内存,节省了磁盘空间和内存资源,并且更容易被更新。
动态链接库还有以下优点:

  1. 当你需要更新模块的功能时,可以只更新动态链接库,不用重新编译程序
  2. 可以链接多个程序。
  3. 可以链接不同语言编写的程序。
  4. 可以降低模块之间的耦合度。

相反,静态链接库在编译时就会被链接进程序中,因此一旦发布就不能再更改,如果不重新编译程序就无法更新库的功能。
总的来说,如果模块需要经常更新或具有跨平台的需求,动态链接库是一个更好的选择。

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

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

相关文章

推荐一份适合所有人做的副业,尤其是程序员。

我建议每个人都去尝试一下网上接单,这是一个门槛低、类型多样的方式,尤其适合程序员! 在接单平台上,你可以看到各种类型的兼职。以freelancer为例,你可以在这里找到技术、设计、写作等类型的兼职,只要发挥…

广告算法资料汇总【建设中】

业内大佬 阿里妈妈技术 张俊林 王喆 萧瑟 朱小强 综合 付海军:基于互联网广告发展演变和思考(附视频讲解PPT) 广告算法工程师入门_广告与算法的博客-CSDN博客 广告算法学习笔记 20万、50万、100万的算法工程师,到底有什么区别…

EtherCAT转Modbus网关的 EtherCAT从站配置案例

兴达易控EtherCAT转Modbus网关(XD-MDEC20 )是一款具备ETHERCAT从站功能的通讯网关,其主要作用是将ETHERCAT网络和MODBUS-RTU网络连接起来。该网关可作为ETHERCAT总线中的从站使用,同时也能够连接到MODBUS-RTU总线中,作…

upload-labs关卡4(黑名单点空格绕过或htaccess绕过)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第四关方法一通关思路1.看源码2、点空格绕过 三、靶场第四关方法二通关思路1、htaccess文件是什么2、通过上传htaccess文件进行绕过1、使用前提2、上传htaccess文件,然后再上传phpinfo的jpg文件 总结 前言 此文章只用于学…

轻量封装WebGPU渲染系统示例<29>- 深度模糊DepthBlur(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/DepthBlur.ts 当前示例运行效果: 此示例基于此渲染系统实现,当前示例TypeScript源码如下: const blurRTTTex0 { diffuse: { uuid: "rtt0", …

数据结构-堆排序及其复杂度计算

目录 1.堆排序 1.1 向上调整建堆 1.2 向下调整建堆 2. 两种建堆方式的时间复杂度比较 2.1 向下调整建堆的时间复杂度 2.2 向上调整建堆的时间复杂度 Topk问题 上节内容,我们讲了堆的实现,同时还包含了向上调整法和向下调整法,最后我们…

为什么要安装田间气象站?

随着农业科技的发展,越来越多的农民朋友开始关注如何利用科技手段来提高农业生产效益。其中,安装田间气象站成为了许多农民朋友的选择之一,为什么会有这种情况呢?安装田间气象站会带来哪些优势呢? 一、了解气候变化 气…

Vue3问题:如何实现页面引导提示?

前端功能问题系列文章,点击上方合集↑ 序言 大家好,我是大澈! 本文约1700字,整篇阅读大约需要3分钟。 本文主要内容分三部分,第一部分是需求分析,第二部分是实现步骤,第三部分是问题详解。 …

No194.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

C语言--假设共有鸡、兔30只,脚90只,求鸡、兔各有多少只​

一.题目描述 假设共有鸡、兔30只,脚90只,求鸡、兔各有多少只? 二.思路分析 本题是一个典型的穷举法例题,而穷举法,最重要的就是条件判断。⭐⭐ 本题中的条件很容易发现: 假设鸡有x只,兔有y只…

【C++类和对象下:解锁面向对象编程的奇妙世界】

【本节目标】 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。…

Matlab论文插图绘制模板第126期—分组三维气泡图

在之前的文章中,分享了Matlab三维气泡图的绘制模板: 特征渲染的三维气泡图: 进一步,再来分享一下分组三维气泡图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋…

java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通

文章目录 函数式编程Lambda表达式Stream流创建流中间操作终结操作注意事项 Optional创建对象消费值获取值过滤判断数据转换 方法引用高级用法基本数据类型优化并行流 函数式编程 不关心具体的对象,只关心数据参数和 具体操作 Lambda表达式 格式: () -&…

基于缎蓝园丁鸟算法优化概率神经网络PNN的分类预测 - 附代码

基于缎蓝园丁鸟算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于缎蓝园丁鸟算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于缎蓝园丁鸟优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

css3 初步了解

1、css3的含义及简介 简而言之,css3 就是 css的最新标准,使用css3都要遵循这个标准,CSS3 已完全向后兼容,所以你就不必改变现有的设计, 2、一些比较重要的css3 模块 选择器 1、标签选择器,也称为元素选择…

C++算法: 最大化数组末位元素的最少操作次数

涉及知识点 数学 题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,这两个数组的长度都是 n 。 你可以执行一系列 操作(可能不执行)。 在每次操作中,你可以选择一个在范围 [0, n - 1] 内的下标 i ,并交换 num…

MyBatis 知识总结

1 MyBatis 1.1 简介 持久层框架,用于简化JDBC开发 JavaEE三层架构:表现层、业务层、持久层 表现层:做页面展示 业务层:做逻辑处理 持久层:负责将数据保存到数据库的那一层代码 框架:半成品软件&#xff0…

软件外包开发的需求对接

软件外包开发的成功与否很大程度上取决于需求对接的有效性。以下是一些建议,可帮助您在软件外包开发中进行需求对接,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.明确业务目标和需求&…

CSDN每日一题学习训练——Java版(字符串相乘、子集、删除链表的倒数第 N 个结点)

版本说明 当前版本号[20231112]。 版本修改说明20231112初版 目录 文章目录 版本说明目录字符串相乘题目解题思路代码思路补充说明参考代码 子集题目解题思路代码思路参考代码 删除链表的倒数第 N 个结点题目解题思路代码思路参考代码 字符串相乘 题目 给定两个以字符串形…

解决谷歌浏览器卸载后重装失败谷歌浏览器无法更新

一.谷歌浏览器卸载后重装失败 大多数情况都是卸载残留导致的。所以要去清理注册表。 winR,然后输入regedit,启动注册表,HKEY_CURRENT_USER/HKEY_CURRENT_USER/Software中的Google文件夹删除即可,然后重启电脑,如果还…