当前位置: 首页 > news >正文

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

一.动静态库的理解。

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

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

相关文章:

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

一.动静态库的理解。 1.什么是库? 代码是无穷无尽的,当程序猿在写一些项目时,未必所有代码亲历亲为,他们可以在网上寻找大佬写过的一些有关需求的代码,这些代码可以让他们拿过来直接使用,而省去了许多精力…...

【趣味游戏-08】20240123点兵点将点到谁就是谁(列表倒置reverse)

背景需求: 上个月,看到大4班一个孩子在玩“点兵点将点到谁就是谁”的小游戏,他在桌上摆放两排奥特曼卡片,然后点着数“点兵点将点到谁就是谁”,第10次点击的卡片,拿起来与同伴的卡片进行交换。他是从第一排…...

cherry键盘alt+tab无法切换窗口的问题解决

现象: alt 好用, tab好用,tabalt不好用。 原因: 键盘误触了关闭了alttab的功能。 不同的樱桃键盘可能方法不一样,下面是两个方案,本人的键盘是MX6.0 G80 3930红轴,用的方法一解决就了&#…...

「nuxt2配置tailwindcss」nuxt2添加tailwindcss详细步骤!解决版本不对称各种报错~~

运行环境 node和npm使用版本 node v14.21.3 (npm v6.14.18) 1.插件下载 官方文档说明 npm install -D nuxtjs/tailwindcss3.4.3 tailwindcss3.4.1 postcss^8.4.33 autoprefixer10.4.17 2.nuxt.config.js配置 module.exports {// ...buildModules: [nuxtjs/tailwindcss],// …...

1、中级机器学习课程简介

文章目录 1、课程简介2、先决条件 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 1、课程简介 欢迎来到机器学习中级课程! 如果你对机器学习有一些基础,并且希望学习如何快速提高模型质量…...

Mybtisplus对时间字段进行自动填充

一、引入依赖 <!-- mybatis-plus-boot-starter--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency> 二、配置类 这里我…...

[HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…...

音频特效SDK,满足内容生产的音频处理需求

美摄科技&#xff0c;作为音频处理技术的佼佼者&#xff0c;推出的音频特效SDK&#xff0c;旨在满足企业内容生产中的音频处理需求。这款SDK内置多种常见音频处理功能&#xff0c;如音频变声、均衡器、淡入淡出、音频变调等&#xff0c;帮助企业轻松应对各种音频处理挑战。 一…...

使用vue2写一个太极图,并且点击旋转

下面是我自己写的一个代码&#xff0c;命名有些不规范&#xff0c;大家不要介意。 <template><div class"qq"><div class"app" :style"{ transform: rotateStyle }"><div class"app1"><div class"ap…...

张量计算和操作

一、数据操作 1、基础 import torchx torch.arange(12) # x:tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])x.shape # torch.Size([12])x.numel() # 12x x.reshape(3, 4) # tensor([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11]])torch.zeros((2…...

【Spring Boot 3】【JPA】枚举类型持久化

【Spring Boot 3】【JPA】枚举类型持久化 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...

SVN 常用命令汇总(2024)

1、前言 1.1、如何检索本文档 使用CSDN自带的“目录”功能进行检索&#xff0c;会更容易查找到自己需要的命令。 1.2、svn常用命令查询&#xff1a;help —— 帮助 在使用过程中&#xff0c;可随时使用help命令查看各常用svn命令&#xff1a; svn help2、检出及更新 2.1、…...

K8S四层代理Service-02

Service的四种类型使用 ClusterIP使用示例Pod里使用service的服务名访问应用 NodePort使用示例 ExternalName使用示例 LoadBalancer K8S支持以下4种Service类型&#xff1a;ClusterIP、NodePort、ExternalName、LoadBalancer 以下是使用4种类型进行Service创建&#xff0c;应对…...

3、非数值型的分类变量

非数值型的分类变量 有很多非数字的数据,这里介绍如何使用它来进行机器学习。 在本教程中,您将了解什么是分类变量,以及处理此类数据的三种方法。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文章目录 1、简介2、三种方法的使用1…...

国内免费chartGPT网站汇总

https://s.suolj.com - &#xff08;支持文心、科大讯飞、智谱等国内大语言模型&#xff0c;Midjourney绘画、语音对讲、聊天插件&#xff09;国内可以直连&#xff0c;响应速度很快 很稳定 https://seboai.github.io - 国内可以直连&#xff0c;响应速度很快 很稳定 http://gp…...

【Alibaba工具型技术系列】「EasyExcel技术专题」实战研究一下 EasyExcel 如何从指定文件位置进行读取数据

实战研究一下 EasyExcel 如何从指定文件位置进行读取数据 EasyExcel的使用背景EasyExcel的时候痛点EasyExcel对比其他框架 EasyExcel的编程模式EasyExcel读取的指定位置导入数据的流程表头校验invokeHeadMap()方法 数据处理invoke()方法 执行中断hasNextdoAfterAllAnalysed()方…...

java.security.InvalidKeyException: Illegal key size错误

出现的问题 最近在对接第三方&#xff0c;涉及获取token鉴权。在本地调试能获取到token&#xff0c;但是在Linux环境上调用就报错&#xff1a;java.security.InvalidKeyException: Illegal key size 与三方沟通 &#xff0c;排除了是传参和网络的原因&#xff1b;搜索资料发现…...

python脚本,实现监控系统的各项资源

今天的文章涉及到docker的操作和一个python脚本&#xff0c;实现监控网络的流量、CPU使用率、内存使用率和磁盘使用情况。一起先看看效果吧&#xff1a; 这是在控制台中出现的数据&#xff0c;可以很简单的看到我们想要的监控指标。如果实现定时任务和数据的存储、数据的展示&a…...

Flink处理函数(2)—— 按键分区处理函数

按键分区处理函数&#xff08;KeyedProcessFunction&#xff09;&#xff1a;先进行分区&#xff0c;然后定义处理操作 1.定时器&#xff08;Timer&#xff09;和定时服务&#xff08;TimerService&#xff09; 定时器&#xff08;timers&#xff09;是处理函数中进行时间相关…...

服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 数台服务器数台存储阵列柜&#xff0c;共上百块硬盘&#xff0c;划分了数十组lun。 服务器故障&检测&#xff1a; 外部因素导致服务器进水&#xff0c;进水服务器中一组阵列内的所有硬盘同时掉线。 北亚数据恢复工程师到达现场后发现机房内…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...