Linux动态库和静态库的制作和使用

一、什么是动态库跟静态库?

程序函数库分为3种类型:静态函数库(stasic libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries);

1.静态函数库

在程序执行(编译)前就加入到目标程序中去。

优点:

1.静态库被打包到应用程序中加载速度快

2.发布程序无需提供静态库,因为已经在app中,移植方便

缺点:

1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

2.更新、部署、发布麻烦

2.动态库

是在程序执行时动态(临时)由目标程序去调用
优点:

1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。

2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。

缺点:
1.加载速度比静态库慢
2.发布程序需要提供依赖的动态库

3、库的制作
3.1、静态库的制作:格式xxxx.a

a. gcc calcufuncs.c -c //生成xxx.o文件
b. ar rcs libcalcufunc.a calcufuncs.o //xxx.o文件生成xxx.a静态库文件

​ 静态库的文件的名字一般(取得名字尽量开头lib + 原名字)
eg:
calcufuncs->libcalcufunc.a

3.2、动态库的制作:格式xxxx.so

gcc -shared -fpic calcufuncs.c -o libcalc.so
参数说明:
​ -shared 指定生成动态库
​ -fpic 标准,FPIC选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。

4、库的使用
4.1、 静态库的使用

gcc calculatorT.c -lcalcufunc -L ./ -o mainProStatic
参数说明:
-lcalcufunc -l是制定要用的静态库,库名“砍头去尾”
-L告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib /usr/local/lib去找

动态库:
将制作好的库 libcalc.so放到./目录下
gcc calculatorT.c -lcalc -L ./ -o mainProDy

5、引用动态库,怎么指定动态库的位置
5.1、临时指定

export LD_LIBRARY_PATH=“/home/pi/back/test”
可以写个脚本执行:

start.sh

export LD_LIBRARY_PATH="/home/pi/back/test"./mainProDy ​         

然后给权限:chmod +x start.sh

5.2、永久设置

cd:进入家目录。
vi .bashrc:打开配置文件。
export LD_LIBRARY_PATH=绝对路径:设置环境变量写入绝对路径。
关掉终端重新打开才能生效,终端每次重启都会先读取.bashrc。

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

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

相关文章

如何从零开始拆解uni-app开发的vue项目(三)

前言:前两篇文章我们讲解了如何拆解uni-app开发的项目结构、实现前台数据的动态加载,今天讲一篇如何实现动态加载功能列表,以及美化界面。话不多说,直接先看源码: 在用户成功登录后,会跳转到menu.vue菜单, 再次点击点检功能时,会进入点检的具体功能跳转菜单,我们的点…

在Linux/Debian/Ubuntu上通过 Azure Data Studio 管理 SQL Server 2019

Microsoft 提供 Azure Data Studio,这是一种可在 Linux、macOS 和 Windows 上运行的跨平台数据库工具。 它提供与 SSMS 类似的功能,包括查询、脚本编写和可视化数据。 要在 Ubuntu 上安装 Azure Data Studio,可以按照以下步骤操作&#xff1…

Flink1.18 如何配置算子级别的TTL

1. 解释 从 Flink 1.18 开始,Table API & SQL 支持配置细粒度的状态 TTL 来优化状态使用,可配置粒度为每个状态算子的入边数。具体而言,OneInputStreamOperator 可以配置一个状态的 TTL,而 TwoInputStreamOperator&#xff0…

Sphinx + Readthedocs 避坑速通指南

博主在学习使用 Sphinx 和 Read the docs 的过程中, 碰到了许多奇葩的 bug, 使得很简单的任务花费了很长的时间才解决,现在在这里做一个分享,帮助大家用更少的时间高效上线文档的内容。 总的来说, 任务分为两个部分: …

UE5制作推箱子动作时获取物体与角色朝向的角度及跨蓝图修改变量

就是脑残死磕,你们如果有更好的方法一定要留言啊~~独乐乐不如众乐乐。 做推箱子的时候需要考虑脸是不是面对着箱子,不是必须90度,可以有一个-45~45度的范围。 摸索了一下,有几种做法和几个小白坑,这里列出来。 一、准…

python 创建word并添加文字和统计图

在Python中,可以使用python-docx库来创建Word文档,并添加文本和统计图。以下是一个简单的例子,演示如何创建一个Word文档,添加标题、文本和一个简单的统计图(这里以条形图为例)。 首先,安装所需…

mysql 索引原理为什么用b+树而不用二叉树

在数据库中,索引是一种数据结构,它能够快速定位到存储在数据库表中特定行的数据。MySQL等数据库管理系统通常使用B树作为索引的数据结构,而不使用二叉树,主要基于以下几个原因: 高度平衡:B树是一种多路搜索…

Ubuntu 下conda创建环境失败报错相关问题

(1) env |grep -i proxyunset http_proxy unset https_proxy unset no_proxy unset HTTP_PROXY unset HTTPS_PROXY unset NO_PROXY(2) vim ~/.condarc将里面内容替换为: channels:- https://mirrors.tuna.tsinghua.…

软件推荐 篇三十七:开源免费无广告的在线音乐免费播放 | MusicFree纯净无广告体验-小众冷门推荐

引言 自从QQ音乐没了杰伦、某云开始收费,除了各种广告弹窗导致电脑卡的要死,打工人就靠这点音乐背景熬夜了,木有办法,得有个开源免费的听歌软件吧,一搜github,软件一大堆,作为一个打工仔&#…

【前端寻宝之路】学习和总结HTML表格的实现和合并

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-IWDj0gWiFt6IMq3x {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

LeetCode的LRU缓存实现

LRU是什么意思 LRU是操作系统底层的一个页面置换算法,当空间不够需要换出最长时间没有使用的页面,在本题中的意思就是当到达容量上限的时候要换出最长时间没有被访问过的节点。 如何实现 LRU的实现可以使用链表的方式,参照MySQL的实现&…

GraphPad Prism 10:一站式数据分析解决方案

GraphPad Prism 10是一款功能强大的数据分析和可视化软件,广泛应用于生命科学研究、医学、生物、化学等多个领域。以下是对其详细功能的介绍: 首先,GraphPad Prism 10具有出色的数据可视化功能。它支持各种类型的图表和图形,包括…

解决arco-design下拉框回显id的问题

问题描述 下拉框回显选项中没有的选项,就会出现以下情况,只能把uid回显上去 解决方案 使用ui框架自带的属性fallback-option 用法 按以上操作,即可解决选择框回显uid问题

十一.matplotlib可视化

目录 十一.matplotlib可视化 1 数据可视化 2 应用场景 3 Matplotlib 脚本层 美工层 后端层 3.1 第一个绘图程序 matplotlib常用配置 查看自己电脑上的 字体库 3.2 基本绘图 plt.plot() 3.3 样式和颜色 3.4 画布配置figure 坐标轴及标签 设置图例??? 添加注…

【QT+QGIS跨平台编译】之八十七:【QGIS_Gui跨平台编译】—【qgis_gui.h生成】

文章目录 一、qgis_gui.h介绍二、信息分析三、qgis_gui.h生成一、qgis_gui.h介绍 qgis_gui.h 是 QGIS(Quantum GIS)软件中的一个头文件,主要用于服务于QGIS_GUI库的编译,包含导入、导出宏信息的定义。 二、信息分析 在qgis\src\gui目录,CMakeLists.txt文件记录了相关信息…

python loguru 日志数据代码模块+飞书消息通知

前提: 之前python文件输出日志到文件的时候,使用logging模块,发现特别麻烦,需要文件日期切分,异步打印日志,文件留存时间,这些功能的实现就很麻烦,都需要自己写,之后发现…

Vue3中的reactive与ref

前言&遇到的bug reactive与ref都是Vue3中非常重要的API,众所周知,用这两个API可以创建响应式数据,从而实现Vue的数据驱动视图。 平时用的时候只知道用ref定义基本数据类型,reactive定义引用数据类型。 因为今天发现一个bug…

vue项目的性能优化

结合lighthouse查看各项数据,不断进行性能优化,可以从代码、打包、部署这三个层面来优化 代码层面 1、v-if和v-show区分使用 v-if(惰性的)用的条件判断,是惰性的,false的话初始不会渲染,适用…

【DevOps云实践】使用Azure Pipeline部署Function App

目录 介绍1 Azure DevOps2 微软Azure3 Azure Pipelines3.1 创建流水线**3.1.2 创建流水线**3.2 创建库3.3 运行流水线当流水线成功验证编译的YAML时,将显示阶段和作业。3.4 流水线审阅3.5 检查函数应用结论推荐超级课程: Docker快速入门到精通Kubernetes入门

32、计算e

作者: Turbo时间限制: 1S章节: 循环 问题描述 : 利用公式e1 1/1! 1/2! 1/3! ... 1/n!,编程计算e的近似值,直到最后一项的绝对值小于threshold(该项不包括在结果内),输出e的值并统计累加的项数。 输入说明 : 输…