动静态库的理解、制作、使用。

一.动静态库的理解。

1.什么是库?

代码是无穷无尽的,当程序猿在写一些项目时,未必所有代码亲历亲为,他们可以在网上寻找大佬写过的一些有关需求的代码,这些代码可以让他们拿过来直接使用,而省去了许多精力。把一些代码进行打包,形成的便是库了。 


上面所说,库就是将代码进行打包。这个说法是方便读者理解而所说的。要想进一步的理解库,我们要对程序的编译过程进行简单理解。 

程序的编译有四道工序预处理,编译,汇编,链接。

预处理:头文件展开,去注释,条件编译,宏替换。.c->.i

编译:将代码编译为汇编代码。.i->.s

汇编:将汇编代码转为可重定位的二进制文件。.s->.o

链接:链接库文件,形成可执行程序。.o->exe


库文件便是.o文件的集合,当程序猿拥有了.o文件,每次复用这些代码就不需要从头开始编译,只需要拥有这些.o文件和对应的头文件,就可以轻松的使用别人的代码,在自己的.c文件中包头文件,编译时进行库的链接。 

2.动静态库的区别

静态库:以拷贝的方式,将方法的集合(库)直接拷贝到可执行程序中
动态库:以动态链接的方式,将要链接的库函数地址拷贝到可执行程序中

静态库将方法的集合(库)直接拷贝可执行程序中就决定了这个可执行程序在运行的时候不再需要库文件,可以在随意运行,但把库直接拷贝到可执行程序当中会导致可执行程序体积巨大

 动态库相较于静态库更加灵活,可以做到一库同时被多个可执行程序使用,每个可执行程序内部只有库函数的地址,并不是将整个库内置入可执行程序中,让可执行程序体积小巧

linux系统中:静态库后缀为.a 动态库后缀为.so

windows系统中: 静态库后缀为.lib 动态库后缀为.dll

二.动静态库的制作和使用。

接下来亲手制作动静态库来感受:

静态库的制作和使用:

我们将要制作一个简易的math库,库中包含加减乘除四种方法。在main.c中调用这些方法。

 

 我们将mathlib文件夹中的.c文件全部编译为.o二进制文件

 .c文件已经没用了,删除

现在这个mathlib文件夹中只有头文件和二进制.o文件了,我们将所有.o文件打包形成静态库,使用命令:

ar -rc libmath.a *.o   //将所有.o二进制文件打包形成math静态库

库已经制作完毕,将所有.o文件删除

 现在mathlib文件夹中仅有静态库和头文件了。下面尝试编译main.c

这里涉及gcc编译时的一些选项: 


动态库的制作和使用:

动态库的制作和静态库的制作在.o文件打包之前完全相同,在.o文件打包形成动态库的时候改为gcc的命令:

gcc -shared -o libmath.so *.o

编译时和静态库做法也相同

只不过在运行可执行程序时会报错:原因是没有将可执行程序和动态库建立动态链接

下面提供多种动态链接的方法:

1.将动态库拷贝到系统库目录/usr/lib64中(运行时默认会在这里查找需要的库)

2.将动态库拷贝到可执行程序所在的目录 (运行时默认会在当前目录查找需要的库)

3.建立软链接(在当前目录或者/usr/lib64目录)

ln -s lib/mathlib.so mathlib.so

4.设置环境变量(LD_LIBRARY_PATH,默认会在这个环境变量里查找需要的库)

5.创建系统关于动态库的配置文件,

touch /etc/ld.so.conf.d/dy.conf

然后在新建的配置文件中添加动态库的绝对路径。

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

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

相关文章

android使用相机 intent.resolveActivity returns null

问题 笔者使用java进行android开发,启动相机时 intent.resolveActivity returns null takePictureIntent.resolveActivity(getPackageManager()) null详细问题 笔者使用如下代码启动相机 // 启动相机SuppressLint("LongLogTag")private void dispatc…

大数据开发之Spark(RDD弹性分布式数据集)

第 1 章:rdd概述 1.1 什么是rdd rdd(resilient distributed dataset)叫做弹性分布式数据集,是spark中最基本的数据抽象。 代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 1.1…

Pycharm运行提示(运行‘Python测试(00.py内)‘(u)

为什么有时候我在pycharm中运行代码会出现图片中的问题? 我们该如何改过来? 很简单 点击文件-设置 点击Python集成工具,在默认测试运行程序里修改为Unittest即可 再次运行代码就会显示正常的运行 你的pycharm可能是英文 如何英文变中文&…

idea——git提交到本地记录如何退回/删除

目录 一、git提交到本地记录如何退回/删除 一、git提交到本地记录如何退回/删除 git提交到本地记录,如下图【更新】记录,表示本次提交到git本地需要退回/删除的操作: 选中项目,右键点击【git】——>【Show History】——>…

书生·浦语大模型实战营-学习笔记4

XTuner 大模型单卡低成本微调实战 Finetune简介 常见的两种微调策略:增量预训练、指令跟随 指令跟随微调 数据是一问一答的形式 对话模板构建 每个开源模型使用的对话模板都不相同 指令微调原理: 由于只有答案部分是我们期望模型来进行回答的内容…

2024.1.24 GNSS 学习笔记

1.伪距观测值公式 2.载波相位观测值公式 3.单点定位技术(Single Point Positionin, SPP) 仅使用伪距观测值&#xff0c;不使用其他的辅助信息获得ECEF框架下绝对定位技术。 使用广播星历的轨钟进行定位&#xff0c;考虑到轨钟的米级精度&#xff0c;所以对于<1米的误差&…

【Android】在WSA安卓子系统中进行新实验性功能试用与抓包(2311.4.5.0)

前言 在根据几篇22和23的WSA抓包文章进行尝试时遇到了问题&#xff0c;同时发现新版Wsa的一些实验性功能能优化抓包配置时的一些步骤&#xff0c;因而写下此篇以作记录。 Wsa版本&#xff1a;2311.40000.5.0 本文出现的项目&#xff1a; MagiskOnWSALocal MagiskTrustUserCer…

【刷题】 leetcode 面试题 01.06 字符串压缩

字符串压缩 字符串压缩思路一&#xff08;双指针顺畅版&#xff09;思路二&#xff08;sprintf函数巧解版&#xff09; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 字符串压缩 来看题目&#xff1a; 根据题目…

【华为 ICT HCIA eNSP 习题汇总】——题目集4

1、&#xff08;多选&#xff09;网络中出现故障后&#xff0c;管理员通过排查发现某台路由器的配置被修改了&#xff0c;那么管理员应该采取哪些措施来避免这种状况再次发生&#xff1f; A、管理员应该通过配置 ACL 来扩展只有管理员能够登录设备 B、管理员应该在路由的管理端…

基于Servlet建立表白墙网站

目录 一、设计思想 二、设计表白墙页面&#xff08;前端--VSCode&#xff09; 1、效果图 2、html部分&#xff08;网页上有哪些内容&#xff09; 3、css部分&#xff08;页面内容的具体样式&#xff09; 4、js部分&#xff08;页面行为&#xff09; 三、借助Servlet实现客…

python内置函数有哪些?整理到了7大分类48个函数,都是工作中常用的函数

python内置函数 一、入门函数 1.input() 功能&#xff1a; 接受标准输入&#xff0c;返回字符串类型 语法格式&#xff1a; input([提示信息])实例&#xff1a; # input 函数介绍text input("请输入信息:") print("收到的数据是:%s" % (text))#输出…

Linux之快速入门

一、Linux目录结构 从Windows转到Linux最不习惯的是什么&#xff1a; 目录结构 Windows会分盘&#xff0c;想怎么放东西就怎么放东西&#xff0c;好处自由&#xff0c;缺点容易乱 Linux有自己的目录结构&#xff0c;不能随随便便放东西 /&#xff1a;根目录/bin:二进制文件&…

达梦数据库Windows安装教程:从准备到完成

目录 博客前言&#xff1a; 一.达梦数据库安装前准备 1.下载 2.进行解压 装载 二.正式安装 选择语言与时区 安装向导 许可证协议 验证 Key 文件 选择安装组件 选择安装目录 安装前小结 数据库安装 数据库安装完成 三.配置实例 选择操作方式 创建数据库模板 选…

微信小程序-03

小程序官方把 API 分为了如下 3 大类&#xff1a; 事件监听 API 特点&#xff1a;以 on 开头&#xff0c;用来监听某些事件的触发 举例&#xff1a;wx.onWindowResize(function callback) 监听窗口尺寸变化的事件 同步 API 特点1&#xff1a;以 Sync 结尾的 API 都是同步 API 特…

Docker(十六)Kubernetes - 开源容器编排引擎

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Kubernetes Kubernetes 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统&#xff0c;它不仅支持常见的云平台&#xff0c;而…

macOS跨进程通信: TCP Socket 创建实例

macOS跨进程通信: TCP Socket 创建实例 一&#xff1a; 简介 Socket 是 网络传输的抽象概念。 一般我们常用的有Tcp Socket和 UDP Scoket&#xff0c; 和类Unix 系统&#xff08;包括Mac&#xff09;独有的 Unix Domain Socket&#xff08;UDS&#xff09;。 Tcp Socket 能够…

xshell可以远程登录服务器但是vscode一直显示让输入密码的解决方案

vscode报错 但是xshell可以登录 原因&#xff1a;可能因为我上一次没有恰当的退出远程链接导致的&#xff0c;我每次退出远程都是直接强制关闭VScode。 解决方法&#xff1a;打开VScode的 view &#xff08;查看&#xff09; palette&#xff08;命令面板&#xff09;然后输…

【数据结构】 顺序栈的基本操作 (C语言版)

目录 一、顺序栈 1、顺序栈的定义&#xff1a; 2、顺序栈的优缺点 二、顺序栈的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、顺序栈的初始化 4、顺序栈的入栈 5、顺序栈的出栈 6、取栈顶元素 7、栈的遍历输出 8、顺序栈的判空 9、顺…

【算法专题】动态规划之路径问题

动态规划2.0 动态规划 - - - 路径问题1. 不同路径2. 不同路径Ⅱ3. 珠宝的最高价值4. 下降路径最小和5. 最小路径和6. 地下城游戏 动态规划 - - - 路径问题 1. 不同路径 题目链接 -> Leetcode -62.不同路径 Leetcode -62.不同路径 题目&#xff1a;一个机器人位于一个 m …

(2)(2.4) CRSF/ELRS Telemetry

文章目录 前言 1 ArduPilot 参数编辑器 前言 &#xff01;Note ELRS&#xff08;ExpressLRS&#xff09;遥控系统使用穿越火线协议&#xff0c;连接方式类似。不过&#xff0c;它不像穿越火线那样提供双向遥测。 TBS CRSF 接收机与 ArduPilot 的接口中包含遥测和遥控信息。…