动态库与静态库
1. 库
是代码的二进制的封装形式
在其他的源代码或库中,可以直接调用库的,但是又看不到它
没有公开源代码库的这种实现方法有利于模块化 而且只要接口合理
不影响库的使用的
sum.c sum.h
int sum(int a,int b) {
return a+b;
}xxx.c
需要使用sum 原来的做法 就是直接把源代码拷贝
(1)
直接给源代码,不利于知识产权的保护
想给你用,但是又让你知道,到底如何去实现的
(2)
加入有一天,sum文件的实现,更新换代了,使用sum的代码,需要重新编译,打包,下载
现在: 使用库
sum.c sum.h
int sum(int a,int b) {
return a+b;
}
编译,生成libxxxx.so(库的二进制)xxx.c
想要去使用sum,直接链接到libxxx.so
=>a.out 运行a.out 加载libxxxx.so就可以了库
动态库 和 静态库
2. 动态库
动态库的使用步骤
1. 制作动态库
a.编辑源代码(库的代码)
如:
LinkedList.c 功能函数的实现
LinkedList.h 接口文件
库的源代码 不能包含 main函数
b.生成动态库
gcc(arm-linux-gcc) -shared -fpic -o libLinkedList.so LinkedList.c(可以根据自己需要多加其他的.c)
把LinkedList.c编译成动态库,生成的动态库的名字 libLinkedList.so
-shared 生成动态库
-fpic 与位置无关
-o 指定生成动态库的名字
动态库的名字 一般都只以lib开头,以.so结尾的文件
lib[0-9a-zA-Z]+\.so2. 使用动态库
a.把头文件和库拷给需要的人
xxx.c
<------LinkedList.h
<------libLinkedList.so
gcc xxx.c -I 目录1 -I 目录2 ...... -L 目录名字 -l LinkedList -o xxx
-I(i的大写) 接一个目录名,指定的头文件的搜索路径,可以接多个-I inlcude
-L 接一个目录名,指定后面的那个库的搜索路径
-l 库名,把lib .so去掉所剩下的就是库名
eg:
gcc xxx.c -I ../ -L ../ -l LinkedList -o xxx
执行上面的命令,会生成可执行文件xxx 并且这个可执行文件xxx 会使用到库libLinkedList.so
但是在生成xxx的时候,并没有把动态库中内容拷贝到xxx中,只是标记
xxx的运行,需要库的支持的
./link: error while loading shared libraries: libLinkedList.so: cannot open shared object file: No such file or directory
b. 最终运行使用库的那个可执行文件前,确保依赖库在
运行的系统中,只打需要在哪一个目录下搜索依赖库
环境变量
LD_LIBRARY_PATH
LD:loading 加载依赖库的路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的依赖库的路径 绝对路径
or
把依赖库,直接丢到LD_LIBRARY_PATH指定的路径中去
/usr/lib/
3. 静态库
1.制作静态库
1)编辑源代码
2)把所有的源代码编译成.o
gcc(arm-linux-gnueabi-gcc) -c xxx.c -o xxx.o
3)用ar命令把所有的.o文件打包,生成静态库
(arm-linux-gnueabi-)ar -rcs libxxxx.a a.o b.o
-r 更新
-c 创建
-s 创建索引
把a.o b.o打包生成静态库
libxxxx.a2.使用
1)把静态库和头文件拷贝给别人
gcc(arm-linux-gnueabi-gcc) main.c -I ... -L ... -l xxxx -o main
2)直接把可执行文件下载到开发板,运行
4. 动态库与静态库的区别
二进制的封装
区别:
对于动态库,对使用动态库的代码 编译 并没有把动态库编译进去
仅仅做一个标记:我的这个可执行程序在运行,会用到某某某动态库
对于静态库,对使用静态库的代码 编译,只把静态库的内容拷贝到可执行文件当中
动态库的优点
当接口一致(函数名 参数 返回值)的时候,更新动态库,不需要重新编译依赖动态库的可执行程序 a.out
静态库 修改,则需要重新编译所依赖的可执行程序
相关文章:
动态库与静态库
1. 库 是代码的二进制的封装形式 在其他的源代码或库中,可以直接调用库的,但是又看不到它 没有公开源代码 库的这种实现方法有利于模块化 而且只要接口合理 不影响库的使用的 sum.c sum.h int sum(int a,int b) { return ab; } xxx.c 需要使用…...

pdf文件编辑,[增删改查]
pdf文件是投标文件中必不可少的格式,传统的方式先编辑word格式,最后生成pdf,但是有时候需要直接编辑pdf文件,编辑pdf的工具无疑 “adobe acrobat dc”是最好用的之一了 1.把图片文件添加到pdf指定位置,例如把一张图片添…...

如何与LEONI建立EDI连接?
莱尼LEONI是一家为汽车及其他行业提供能源数据管理产品、解决方案及服务的全球供应商。供应链范围从研发生产标准化电缆、特种电缆和数据电缆到高度复杂的布线系统和相关组件。本文将介绍如何与莱尼LEONI建立EDI连接。 什么是EDI? EDI全称Electronic Data Interch…...

算法中的时间复杂度,空间复杂度
一、前言 算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别 衡量不同算法之间的优劣主要是通过时…...

Python基础:推导式(Comprehensions)详解
1. 推导式概念 Python推导式(comprehensions)是一种简洁而强大的语法,用于从已存在的数据(列表、元组、集合、字典等)中创建新的数据结构。推导式包括: 列表推导式元组推导式字典推导式集合推导式 2. 列表…...

安防监控视频融合平台EasyCVR定制化页面开发
安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索…...

Roll-A-Ball 游戏
Roll-A-Ball 游戏 1)学习资料 b站视频教程:https://www.bilibili.com/video/BV18W411671S/文档: * Roll-A-Ball 教程(一), * Roll-A-Ball 教程(二)线上体验roll-a-ball成品 * http://www-personal.umich.e…...

医疗影像数据集—CT、X光、骨折、阿尔茨海默病MRI、肺部、肿瘤疾病等图像数据集
最近收集了一大波关于CT、X光等医疗方面的数据集包含骨折、阿尔茨海默病MRI、肺部疾病等类型的医疗影像数据,废话不多说,给大家逐一介绍!! 1、彩色预处理阿尔茨海默病MRI(磁共振成像)图像数据集 彩色预处理阿尔茨海默病MRI(磁共…...

Linux僵死进程及文件操作
1.僵死进程(僵尸进程): 1.僵死进程产生的原因或者条件: 什么是僵死进程? 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 简而言之,就是子进程先结束,并且父进程没有获取它的退出码; 那么僵死进程产生的原因或者条件就是:子进…...

用Python写一个浏览器集群框架
更多Python学习内容:ipengtao.com 在分布式爬虫和大规模数据采集的场景中,使用浏览器集群是一种有效的方式,可以提高数据采集的速度和效率。本文将介绍如何用Python编写一个简单但强大的浏览器集群框架,以应对需要使用多个浏览器实…...
【Github】git安装
我们经常需要对github上的项目进行复现或者使用,git指令可以方便我们更好地实现他们。 Part 0. 准备 配置代理IP 面对问题:关于登陆github网站网速慢、下载git项目网速慢。 解决:无论是windows还是linux系统,都可以找到/etc/ho…...

sql语法大全
1,创建数据库 create database 数据库名字; 2,查看所有的数据库名称 show databases; MySQL服务器已有4个数据库,这些数据库都是MySQL安装时自动创建的。 information_schema 和 performance_schema 数据库分别是 MySQL 服务器的数据字典(…...
小红书API接口测试 | 小红书笔记详情 API 接口测试指南
一、引言 随着互联网的发展,越来越多的应用开始使用API接口来提供服务。而API接口的测试也变得越来越重要。本文将介绍如何使用Python语言进行小红书笔记详情API接口的测试。 二、小红书笔记详情API接口介绍 小红书笔记详情API接口是用于获取指定笔记详细信息的接…...
实验六:Java流式编程与网络程序设计
一、字节输入/输出流实现数据的保存和读取 编程要求 根据提示,在右侧编辑器补充代码。 编写应用程序(SortArray.java),使用字节输入/输出流实现数据的保存和读取。 要求功能如下: 输入1~100之间的整型数据保存到数组…...

金字塔原理
金字塔原理 来自于麦肯锡公司的第一位女性咨询顾问芭芭拉•明托的著作《金字塔原理》。 原理介绍 此原理是一种重点突出、逻辑清晰、主次分明的逻辑思路、表达方式和规范动作。 金字塔的基本结构是:中心思想明确,结论先行,以上统下ÿ…...

VR全景技术助力政务服务大厅数字化,打造全新政务服务体验
引言: 随着科技的飞速发展,虚拟现实(VR)技术逐渐走进人们的视野。VR全景技术作为VR领域的一项重要应用,以其沉浸式、交互式的特点,正逐渐渗透到各行各业。政务服务大厅作为相关部门与民众之间的桥梁&#…...

使用Python实现SVM来解决二分类问题
下面是一个使用Python实现SVM来解决二分类问题的例子: # 导入所需的库 from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split from sklearn.svm import SVC import matplotlib.pyplot as plt# 生成一个二分类数据集 X, …...
合并PDF出现OOM异常
优化方法一:使用PdfSmartCopy类代替PdfCopy类。这个类可以在合并PDF文件时,检测并消除重复的对象,从而减少内存的占用。您可以参考以下代码示例: //创建一个Document对象 Document document new Document();//创建一个PdfSmartC…...

c语言-数据结构-链式二叉树
目录 1、二叉树的概念及结构 2、二叉树的遍历概念 2.1 二叉树的前序遍历 2.2 二叉树的中序遍历 2.3 二叉树的后序遍历 2.4 二叉树的层序遍历 3、创建一颗二叉树 4、递归方法实现二叉树前、中、后遍历 4.1 实现前序遍历 4.2 实现中序遍历 4.3 实现后序遍历 5、…...
DelayQueue介绍
5.1 DelayQueue介绍&应用 DelayQueue就是一个延迟队列,生产者写入一个消息,这个消息还有直接被消费的延迟时间。 需要让消息具有延迟的特性。 DelayQueue也是基于二叉堆结构实现的,甚至本事就是基于PriorityQueue实现的功能。二叉堆结构…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...