动静态库的制作和使用

news2024/12/28 22:11:41

动静态库

  • 一,什么是库
  • 二,静态库的制作
    • 静态库原理
  • 三,动态库的制作
  • 四,动态库的配置
  • 五,动态库的加载

一,什么是库

🚀库这个东西我们一直在使用,举个简单了例子,无论你是用C的printf还是C++的cout的输出语句,这些函数的实现都不是你完成的,你都是调用了C/C++的标准库的,所以库这个东西我们使用的非常普遍。
🚀我们频繁的使用库就是为了提高我们的开发效率,假设每次的printf都要你自己实现,那可想而知效率肯定不如直接调用库的实现的效率高。
🚀头文件和库是配合使用的,我们要用printf那么就要包stdio.h这个头文件,在编译预处理的阶段头文件会在.c文件中展开,而库是在链接的时候与我们的文件链接在一起的。
🚀理解两种现象:

  • 自动提醒功能

现在绝大多数的开发环境都带有自动提醒的功能,编译器是如何实现这一功能的呢?其实很简单,就是编译器根据用户的输入不断的在头文件中查找,将找到的信息通过下拉框的方式展现给用户,这是依赖于头文件的,如果你没有包头文件的话,是不会有自动提醒功能的。

  • 提示语法错误

其实就是在我们编写代码的时候,编译器不断的在给我们的代码做编译工作,不断的进行语法检查,让后将错误显示出来。

🚀在Linux下动态库是.so 静态库是.a ,在Windows下动态库是.dll,静态库是.lib。

二,静态库的制作

🚀对于C/C++来说,通常将自己写的东西分享给别人的时候,一般是给源代码或者是打成库。

   //myadd.h
   #pragma once 
   int myadd(int x,int y);   
   
   //mysub.h
   #pragma once 
   int mysub(int x,int y); 
   
   //mysub.c
   #include "mysub.h"
   int mysub(int x,int y)
   {
     return x - y;
   }
   
   //myadd.c
   #include "myadd.h"
   int myadd(int x,int y)
   {
     return x + y;                                                                                                                                                                 
   }

🚀我们自己要制作一个math库,里面有加法和减法两种功能,将这个库分享给其他人使用。
🚀制作静态库的步骤:
1,将.c文件编译成.o文件

gcc -c

在这里插入图片描述

2,将.o文件打成静态库

ar -rc libmymath.a *.o //把所有的.o文件打成一个静态库

在这里插入图片描述
注意: 对于库来说lib是它的前缀,如果是静态库那么后缀为.a,如果是动态库那么后缀是.so。
3,将头文件和库文件打包发给其他用户(通常是将库文件放在一个目录下,头文件放在一个目录下)
在这里插入图片描述
在这里插入图片描述
4,其他用户收到库后先解压,然后使用库即可。

#include <stdio.h>
#include "myadd.h"
#include "mysub.h" 
int main()
{
   int a = 10;
   int b = 5;
   printf("%d + %d = %d\n",a,b,myadd(a,b));
   printf("%d - %d = %d\n",a,b,mysub(a,b));                                                                                                                                    
   return 0;
}
gcc -o mytest main.c -I include -L lib -l mymath
//-I :告诉编译器我们头文件的路径
//-L :告诉编译器我们库文件的路径
//-l :告诉编译器我们链接的库的名字

在这里插入图片描述

静态库原理

🚀我们的源文件在连接库文件的时候,对于静待库而言,是将用到的库中的方法的代码直接拷贝到自己的文件当中,形成可执行程序。依赖于静态库形成的可执行程序,即使静态库被删除程序依然可以跑,因为已经将库中的代码拷贝到自己的文件中了。
在这里插入图片描述

三,动态库的制作

🚀其实静态库的使用不多,通常情况下都是使用动态库,因为静态库是将库中的代码拷贝到自己文件中,这无疑增大了文件的体积。在Linux下默认都是连接动态库。
🚀将上面的代码打成动态库
1,生成的.o文件是与位置无关码

gcc -fPIC -c

在这里插入图片描述
2,将.o文件打成动态库

gcc -shared -o libmymath.so *.o

在这里插入图片描述
3,将库文件和头文件打包
在这里插入图片描述
在这里插入图片描述

4,其他用户解压,使用库

gcc -o mytest main.c -L lib -I include -l mymath

在这里插入图片描述
在这里插入图片描述
虽然形成了可执行程序,但是在./运行该程序的时候会发现运行不了,这是什么原因呢?
是这样的,我们在gcc的时候告诉编译器了头文件路径,库文件路径,库文件名称,但是运行的时候操作系统并不知道动态库所在的位置,所以我们要对动态库做配置。

注: 因为编译器对库的默认搜索路径是/lib64,对头文件默认搜索路径是/usr/include,如果使用gcc不想添加-I -L 选项时,可以将头文件和库文件移动到相关默认搜索路径下即可。

四,动态库的配置

🚀配置环境变量LD_LIBRARY_PATH,在这个环境变量中添加动态库的路径即可。
在这里插入图片描述
但是环境变量是内存级的,每次启动机器环境变量都会从相关的配置文件中加载,所以你再重启机器的时候又会发现可执行程序运行不了了。
在这里插入图片描述
🚀将第三方库挪动到/lib64目录下,这是操作系统的默认搜索路径。
在这里插入图片描述
🚀在/etc/ld.so.conf.d/目录下添加配置文件。文件的内容就是动态库的路径。

在这里插入图片描述
在这里插入图片描述
运行的时候还是不行,这是因为配置文件没有生效。

ldconfig //使配置文件生效

在这里插入图片描述

五,动态库的加载

🚀动态库又称为共享库,可以被多个进程所共享,那么是如何做到的呢?
首先说明,动态库与静态库连接方式不同,静态库是把所用到的库中的方法拷贝到自己的文件中,而动态库是把所用到的方法的地址拷贝到相应的位置。
程序运行起来变成一个进程,当他调用动态库中的方法时,此时动态库会被从磁盘加载到物理内存上,之所以称之为共享库是因为物理内存上只存在一份,而用到的进程会通过页表将物理内存上的动态库映射到自己的进程地址空间上,这时就会出现问题,如果动态库中的编码是绝对编码,这就对动态库映射到地址空间的位置是固定的,这几乎是不可能的,所以我们在打动态库的时候,形成的是与位置无关码,说白了就是形成的是相对地址,这样无论动态库被加载到地址空间的哪个位置,只要我们知道它的首地址和偏移量就能找到对应方法的地址。
在这里插入图片描述

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

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

相关文章

netplan, NetworkManager, systemd-networkd简介

1、systemd-networkd简介 systemd-networkd是systemd 的一部分 &#xff0c;负责 systemd 生态中的网络配置部分(systemd-networkd.service, systemd-resolved.service)。使用 systemd-networkd&#xff0c;你可以为网络设备配置基础的 DHCP/静态IP网络等&#xff0c;还可以配…

U8W/U8W-Mini使用与常见问题解决

U8W/U8W-Mini使用与常见问题解决 U8WU8W/U8W-mini简介准备工作U8W/U8W-mini在线联机下载U8W/U8W-mini脱机下载第一步&#xff0c;把程序下载到U8W/U8W-mini烧录器中&#xff1a;第二步&#xff0c;用U8W/U8W-mini烧录器给目标单片机脱机下载 U8W/U8W-mini烧录器使用中常见的问题…

初识Linux运维

一.初识Linux 1.Linux系统内核 内核提供了Linux系统的主要功能&#xff0c;如硬件调度管理的能力。 Linux内核是免费开源的&#xff0c;任何人都可以查看内核的源代码&#xff0c;甚至是贡献源代码。 2.Linux系统发行版 内核无法被用户直接使用&#xff0c;需要配合应用程…

淘宝iOS拍立淘微距能力探索与实现

画面模糊问题的源头也是来自用户的微距体验不佳&#xff0c;我们对问题深入分析&#xff0c;适当拆解。通过 Apple Development Doc 的查阅及实践&#xff0c;一步步抽丝剥茧&#xff0c;最终完美解决用户的体验痛点&#xff0c;也为我们自身沉淀了展示微距的能力。 前言 在最近…

Unix和Linux

UNIX 诞生于 20 世纪 60 年代末 Windows 诞生于 20 世纪 80 年代中期 Linux 诞生于 20 世纪 90 年代初 1965 年&#xff0c;贝尔实验室、美国麻省理工学院和通用电气公司联合发起了Multics 工程计划&#xff0c;目标是开发一种交互式的、具有多道程序处理能力的分时操作系统&a…

NTP服务与SSH服务

NTP&#xff1a;时间同步服务&#xff0c;采用UDP协议&#xff0c;端口号为123。 配置NTP时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 首先&#xff0c;我们必须确保服务端与客户端在同一时区。 更改时区&#xff1a;timedatectl set-timezone asia/shanghai …

隋唐洛阳“西宫”:上阳宫的GIS视角

隋唐洛阳城简介 营建 隋大业元年&#xff08;605年&#xff09;&#xff0c;在隋炀帝的授意下&#xff0c;隋代著名城市设计师宇文恺&#xff0c;在汉魏故城以西重新选址&#xff0c;历时8个月&#xff0c;日役劳工200万&#xff0c;兴建新都洛阳城。 城和苑 隋唐洛阳城采用…

页面注册案例

效果图&#xff1a; 分析业务模块&#xff1a; 发送验证码模块各个表单验证模块勾选已经阅读同意模块下一步验证全部模块&#xff1a;只要上面有一个input验证不通过就不同意提交 业务 1 &#xff1a;发送验证码 用户点击之后&#xff0c;显示05秒后重新获取时间到了&…

大国护眼学习笔记01

第一天&#xff08;23.4.17&#xff09; 2—11节什么是近视&#xff1f; 1、“近视离焦”是指成像点落在视网膜的哪里&#xff1f; 前面 2、“远视离焦”是指成像点落在视网膜的哪里&#xff1f; 后面 3、眼轴变长时&#xff0c;成像点会往前移还是往后移&#xff1f; 前移 4、…

毛灵栋 : 以兴趣为壤,育能力之实 | 提升之路系列(一)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

【RP-RV1126】Ubuntu上配置Buildroot Qt 开发板远程开发调试环境(SSH)

文章目录 一、前提二、基础设置建设Buildroot编译Qt5配置SSHBuildroot文件系统添加账号密码开发板联网Buildroot文件系统构建时打开rsync功能 三、QtCreator配置3.1 配置Qt交叉编译套件(Kits)配置Kits里面的交叉编译器配置Kits里面的qmake工具最后配置Kits 3.2 配置远程部署设备…

VLAN基础实验

实验要求&#xff1a; 1、PC1和PC3所在接口为Access接口 PC2/4/5/6处于同一网段:其中PC2可以访问PC4/5/6 PC4可以访问PC5&#xff0c;但不能访问PC6 PC5不能访问PC6 2、PC1/3与PC2/4/5/6不再同一网段 3、所有PC通过DHCP获取IP地址&#xff0c;且PC1/3可以正常访问PC2/4/5/6 实…

tkinter-TinUI-xml实战(9)crosschat客户端

tkinter-TinUI-xml实战&#xff08;9&#xff09;crosschat客户端 引言声明文件结构核心代码服务端连接登录界面主页面主文件 结语 引言 CrossChat&#xff08;十字街&#xff09;是一个线上匿名群聊平台&#xff0c;类似Hack.Chat。 现在通过websocket简单地构建一个cc的客户…

随机蛙跳算法 (SFLA)简单实现(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着计算机科学与技术的迅速发展,人类生存空间的扩大以及认识与改造世界范围的拓宽,人们对科学技术提出了新的和更高的要求,其…

android中线程池的选择

线程池是把一个或多个线程通过统一的方式进行调度和重复使用的技术。 避免了因为线程过多而带来使用上的开销。 在安卓开发中&#xff0c;为了更好的性能体验&#xff0c;我们在选择线程池的时候&#xff0c;需要从具体需求来考虑&#xff0c;主要考虑以下几方面&#xff1a; …

计算机类专业的普通校招生毕业如何“卷”一份好工作?

毕业差不多两年的校招生有感 一、为什么写这篇文章&#xff1f;二、我 → 一名普通的校招生前身三、我 → 一名普通的校招生养成四、校招如何拿到offer&#xff1f;五、总结 一、为什么写这篇文章&#xff1f; 一开始我写CSDN是为了记录自己学习技术的小日记&#xff0c;小总结…

JavaScript运算符与表达式

目录 一、 二、|| 三、??与?. ?? ?. 四、... 五、[] {} [] {} 一、 严格相等运算符&#xff0c;用作逻辑判断 1 1 // 返回 true 1 1 // 返回 true&#xff0c;会先将右侧的字符串转为数字&#xff0c;再做比较 1 1 // 返回 false&#xff0c;类型不等…

每日学术速递4.22

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Reference-based Image Composition with Sketch via Structure-aware Diffusion Model 标题&#xff1a;通过结构感知扩散模型与草图进行基于参考的图像合成 作者&#xff1a;Kang…

PDF转PPT:省时省力的高效方式

PDF和PPT是日常工作和学习中常见的文件格式&#xff0c;但是它们的使用场景不同&#xff0c;很多时候需要将PDF文件转换为PPT文件才能更好地展示内容。本文将介绍如何使用PDF转PPT工具来实现快速转换&#xff0c;省时省力。 一、为什么需要将PDF文件转换为PPT文件 1.PPT文件更…

English Learning - L2-15 英音地道语音语调 语调四步法 2023.04.17 周一

English Learning - L2-15 英音地道语音语调 语调 2023.04.17 周一 语调概念和汉语拼音对比 语音语调四步法语调练习意群划分重音重中之重语调的选择 语调的含义 语调概念 广义&#xff1a;语音技巧&#xff0c;连读&#xff0c;失去爆破&#xff0c;音同化&#xff0c;还有平…