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

动静态库(Linux)

文章目录

  • 前言
  • 一、静态库
  • 二、动态库
  • 三、深入理解动态库
  • 总结


前言

我们之前用过c语言的库.Linux中默认的都是使用动态库,如果想要使用静态库,就必须加上-static选项。默认都是安装的动态库,系统中一般没有静态库,如果要使用,就需要自己安装。
Linux下动态库是以.so结尾的,静态库是以.a结尾的。
无论是动态库还是静态库,都有自己的名字。比如libc.so,库的名字需要去掉前缀lib,去掉后缀.so,那么这就是一个c标准库。

一、静态库

什么是库呢??
库本质就是把一些.o结合放在一起就是我们使用的库

我们只要拥有.o文件和.h文件就可以调用相关的函数。 比如下面的例子

add.h

#pragma once
int add(int x,int y);

add.c


#include "add.h"
int add(int x,int y)
{return x+y;
}

myfile.c


#include "myfile.h"//打开
myFILE*myopen(const char*path,const char*mode)
{int flag=0;if(strcmp(mode,"w")==0){flag|=O_CREAT|O_WRONLY|O_TRUNC;}else if(strcmp(mode,"a")==0){flag|=O_CREAT|O_APPEND|O_TRUNC;}else if(strcmp(mode,"r")==0){flag|=O_RDONLY;}else{return NULL;}int fd=0;if(flag&O_RDONLY){fd=open(path,flag);}else{umask(0);fd=open(path,flag,0664);}myFILE*fp=(myFILE*)malloc(sizeof(myFILE));fp->inode=fd;fp->pos=0;fp->cap=MAX;fp->flushmode=FLUSHLINE;return fp;}
void myfflush(myFILE*fp)
{write(fp->inode,fp->buffer,fp->pos);fp->pos=0;
}
//写文件
int myfwrite(const void *ptr,size_t n,myFILE*fp)
{//首先放到缓冲区memcpy(fp->buffer+fp->pos,ptr,n);fp->pos+=n;//判断是否需要刷新if(fp->flushmode==1&&fp->buffer[fp->pos-1]=='\n'){myfflush(fp);}if(fp->flushmode==2&&fp->pos==fp->cap){myfflush(fp);}return n;
}
//关闭
void  myclose(myFILE*fp)
{//进程退出先刷新myfflush(fp);close(fp->inode);free(fp);
}

myfile.h

#pragma once #include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>#define FLUSHLINE 1
#define FLUSHFULL 2
#define FLUSHNO 3
#define MAX 4096typedef struct myFILE
{int inode;char buffer[MAX];int pos;int cap;int flushmode;}myFILE;//打开
myFILE*myopen(const char*path,const char*mode);
//写文件
int myfwrite(const void *ptr,size_t n,myFILE*fp);
//刷新
void myfflush(myFILE*fp);
//关闭
void myclose(myFILE*fp);

测试代码test.c

#include <stdio.h>
#include "add.h"
#include "myfile.h"int main()
{int x=10;int y=20;int sum=add(x,y);printf("%d+%d=%d\n",x,y,sum);myFILE*fp=myopen("file.txt","w");if(fp==NULL) {perror("myopen:");return 1;}int cnt=5;char buffer[64]={"hello world\n"};while(cnt--){myfwrite(buffer,64,fp);}myclose(fp);return 0;
}

1.正常测试
下面是我们的结构,我们自己写了两个add和myfile两个函数文件1,我们并不像把.c文件给user,但是好像让他用我们的函数,我们就可以把.o和.h给他,然后这个用户自己写main函数就可以。
在这里插入图片描述
我们测试一下效果
在这里插入图片描述
我们运行看一下结果
在这里插入图片描述
确实完成了我们的任务。
2.打包测试
我们同样也可以把这些.o文件进行打包操作,形成一个文件
在静态库下我们用的打包操作是:ar -rc ,注意按照库的格式命名
查看打包库的情况:ar -tv

在这里插入图片描述
把打包的库文件和.h拷贝到该用户下,编译运行test.c
在这里插入图片描述
我们后发现报错了???这是为什么呢???
我们自己安装的属于第三方库,系统默认回去自己默认的路径去寻找,就不会找到这个库文件,虽然他们在同一路径下。

我们需要指明库的路径和库名称,采用下面指令
gcc 文件 -L(跟路径) -l(跟库名称)
在这里插入图片描述
为什么要有库呢??测试目标文件生成之后,静态库就可以删掉了,程序照样可以正常运行

为什么要有库呢??
1.提高开发效率
2.隐藏源代码

二、动态库

同样还是上面的代码,我们继续测试动态库

1.正常测试
我们如果想要对动态库进行编辑,需要带上 -fPIC(产生位置无关码)选项
在这里插入图片描述
我们如果想对这些.o文件进行打包,我们需要借助-shared(动态格式)选项,对动态库打包不需要其他选项,直接使用gcc就可以
在这里插入图片描述
此时我们就可以正常对test.c进行编译。但是会报错
在这里插入图片描述
此时就与静态库相同,动态库也属于第三方库,需要指定库的路径和库名称
在这里插入图片描述
我们平时使用的库都是把.o文件和.h文件进行打包,上传到网络中,使用者将库下载下来,进阶捷报就可以正常操作了。

下面我们模拟一下这个过程
makefie中内容


libmyc.so:add.o myfile.ogcc -shared -o $@ $^
%.o:%.cgcc -c -fPIC $<.PHONY:clean
clean:rm -rf *.o libmyc.so  mylib mylib.tgz.PHONY:output
output:mkdir -p mylib/includemkdir -p mylib/libcp -rf *.h mylib/includecp -rf *.so mylib/libtar czf mylib.tgz mylib

2.安装测试
我们进行make output操作将相应的内容进行打包
在这里插入图片描述
用户把这个包下载下来,并且解压到自己的路径下,之后把这个压缩包删除就可以。
所谓的把库安装到系统中,本质就是把对应的文件拷贝到系统指定的路径中。
在这里插入图片描述
下面我们再次进行编译,我们可以发现报了一个这样的错误
在这里插入图片描述
头文件找不到,Linux下查找头文件会在当前路径和库对应的路径进行查找,我们的.h文件不在在下级路径下,系统自然就找不到。
我们需要用到-I(大写i)指定头文件路径,同时用-L(指定库路径)和-l(指定库名称)
在这里插入图片描述

3.运行测试
我们正常运行看一下
在这里插入图片描述
发现报错了??这是为什么呢??
编译时我们确定了编译环境所需要的路径以及一系列东西,但是对于运行程序的进程来说,并不知道库的路径(第三方库)。

我们也可以用ldd查看链接了哪些库

在这里插入图片描述

我们要解决这个有四种方法 🌟直接把所使用的库拷贝到系统指定的路径下,一般是/usr/lib(sudo提权)
在这里插入图片描述
🌟使用环境变量LD_LINRARY_PATH,这个环境变量是指,操作系统查找库文件时候,除了去系统指定的目录去查找,同时也会去这个路径下查找
在这里插入图片描述
但是如果我们关掉机器,重新打开,这个环境变量就会消失。如果想让他一直存在,可以在跟目录下的_bash_profile和.bashrc修改即可

🌟使用软链接的方式
在这里插入图片描述
🌟设置配置文件/etc/ld.so.conf.d
将库的路径放在这个目录中,目录名称必须以.conf结尾,之后使用ldconfig使配置生效
在这里插入图片描述

4.动态库&&静态库
🌟如果动态库和静态库同时存在,系统自动使用动态库,如果非要使用静态库,加-static选项
🌟如果我们所用的文件只存在静态库,系统将把这个链接静态库,其余正常链接静态库
🌟如果我们只提供动态库,非得想要静态链接,会报错

三、深入理解动态库

1.系统角度


运行代码,首先创建task_struct ,进程地址空间,将磁盘中test.c文件加载进内存,填写页表内容。动静态库在磁盘中也是一个个的文件,也要加载到内存,放在页表中,与物理内存建立映射。
🌟静态库:把test.c和libmyc.o一起加载到内存中,放在一起。运行时就不需要寻找库了。
🌟动态库:把test.c和libmyc.sof分别加载到内存中,其中动态库会被放在进程地址空间的共享区中。当调用这个库时,去共享区中查找,如果存在这个库,就跳转到共享库中调用。如果不存在就加载到内存中。如果其他文件要调用这个动态库,就直接去调用即可,不用再进行加载。动态库也叫做共享库,本质就是进程中代码和数据仅存在一份。

补充: 1.进程地址空间的内容初始化是根据文件的代码数据进行填充的。
   2.进程同样要对这些库进行管理,怎么管理呢??先描述,在组织
   3.那些库加载了,那些库没有被加载,由操作系统自动完成。
2.编译角度
在磁盘中的文件中代码和数据在没有加载进入内存之前,也有自己对应的地址,数据和代码按照一定的格式进行存储。我们就可以用这个初始化我们进程的进程地址空间了。
编址方式有两种:绝对地址和相对地址,机器一般使用绝对编制的方式。

总结

以上就是今天要讲的内容,本文仅仅详细介绍了 。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

相关文章:

动静态库(Linux)

文章目录 前言一、静态库二、动态库三、深入理解动态库总结 前言 我们之前用过c语言的库.Linux中默认的都是使用动态库&#xff0c;如果想要使用静态库&#xff0c;就必须加上-static选项。默认都是安装的动态库&#xff0c;系统中一般没有静态库&#xff0c;如果要使用&#…...

51单片机和ARM单片机的区别

在嵌入式系统设计与应用中&#xff0c;单片机作为核心控制单元&#xff0c;扮演着至关重要的角色。其中&#xff0c;51单片机和ARM单片机作为两种常见的单片机类型&#xff0c;各自具有独特的特点和优势。本文将从多个维度深入探讨这两种单片机的区别&#xff0c;以便读者更好地…...

[Day 81] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈在食品安全中的應用 前言 食品安全一直是全球關注的問題&#xff0c;隨著全球供應鏈的複雜性增加&#xff0c;追踪食品從生產到消費的過程變得愈發困難。區塊鏈技術以其去中心化、不可篡改的特性&#xff0c;為食品安全提供了可靠的解決方案。在這篇文章中&#xff0c;…...

flac格式怎么转mp3?关于flac转为MP3的方法介绍

flac格式怎么转mp3&#xff1f;MP3格式经过压缩&#xff0c;相较于flac文件&#xff0c;显著减小了文件体积。这一特点使得音乐的存储和传输更加便捷&#xff0c;尤其适合移动设备以及存储空间有限的场景。由于MP3文件体积较小&#xff0c;分享音乐变得非常简单&#xff0c;无论…...

【笔记】KaiOS 系统框架和应用结构(APP界面逻辑)

KaiOS系统框架 最早自下而上分成Gonk-Gecko-Gaia层,代码有同名的目录,现在已经不用这种称呼。 按照官网3.0的版本迭代介绍,2.5->3.0已经将系统更新成如下部分: 仅分为上层web应用和底层平台核心,通过WebAPIs连接上下层,这也是kaios系统升级变更较大的部分。 KaiOS P…...

java项目实现钉钉异常告警实时监控

最近有个小伙伴问我&#xff0c;我们的项目核心业务的地方总是有异常&#xff0c;虽然有打印日志&#xff0c;但不能立马通知我&#xff1b;所以今天我就教大家如何实现异常报警实时提醒 1.需要有钉钉 自己新建的企业用户 2.建一个群&#xff0c;需要有三人以上&#xff1b;…...

Spring Boot应用:电子商务平台开发

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…...

怎么在Vue3项目中引入Vant组件库并使用?

文章目录 前言一、项目中使用步骤1.安装&#xff1a;2.样式的导入&#xff08;2种方法&#xff09;2.1 main.ts全局导入&#xff08;平常自己的项目用的这个全局&#xff09;2.2 按需引入组件样式 (简单介绍一下)1.安装插件2.配置插件 3.组件按需使用&#xff1a;App.vue 总结 …...

springboot中有哪些方式可以解决跨域问题

文章目录 什么是跨域解决方案CrossOrigin注解实现WebMvcConfigurer接口CorsFilter过滤器如何选择&#xff1f; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 Talk is cheap &#xff0…...

Temporal Dynamic Quantization for Diffusion Models阅读

文章目录 AbstractIntroductionBackgrounds and Related Works2.1 扩散模型2.2 量化2.3 量化感知训练和训练后量化 TemporalDynamic Quantization3.1 量化方法3.2 扩散模型量化的挑战3.3 TDQ模块的实现3.4 工程细节时间步的频率编码TDQ模块的初始化 Experimental SetupResults5…...

828华为云征文|华为云Flexus X实例性能实测:速度与稳定性的完美结合

828华为云征文&#xff5c;华为云Flexus X实例性能实测&#xff1a;速度与稳定性的完美结合 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、实践环境介绍2.1 本次实践环境规划2.2 本次实践介绍 …...

【PyTorch】图像分割

图像分割是什么 Image Segmentation 将图像每一个像素分类 图像分割分类 超像素分割&#xff1a;少量超像素代替大量像素&#xff0c;常用于图像预处理语义分割&#xff1a;逐像素分类&#xff0c;无法区分个体实例分割&#xff1a;对个体目标进行分割全景分割&#xff1a;…...

如何快速建立自己的异地互联的远程视频监控系统,通过web浏览器可以直接查看公网上的监控视频(上)

目录 一、需求 二、方案 2.1、计划方案 2.2、实施准备 2.2.1所需配置的产品和服务 2.2.1.1云主机 &#xff08;1&#xff09;选择云平台 &#xff08;2&#xff09;配置云服务器 2.2.2.2视频监控平台软件 &#xff08;1&#xff09;视频监控平台软件 &#xff08;2&am…...

实验2思科网院项目2.7.2-packet-tracer---configure-single-area-ospfv2---实践练习

实践练习 2.7.2-packet-tracer---configure-single-area-ospfv2---实践练习physical-mode 实验拓扑 相关设备配置 实验目标: 第 1 部分&#xff1a;构建网络并配置设备的基本设置 第 2 部分&#xff1a;配置和验证单区域 OSPFv2 的基本部署 第 3 部分&#xff1a;优化和验…...

Nginx实战经验分享:从小白到专家的成长历程!

目录 一、Nginx概述1、Nginx简介&#xff08;1&#xff09;事件驱动模型&#xff08;2&#xff09;异步处理&#xff08;3&#xff09;模块化设计&#xff08;4&#xff09;高性能&#xff08;5&#xff09;反向代理&#xff08;6&#xff09;负载均衡&#xff08;7&#xff09…...

从画质设置看游戏引擎(其一)

前往我的博客&#xff0c;获取无广告&#xff0c;更好的阅读体验 1. 抗锯齿&#xff08;Anti-Aliasing&#xff09; 1.1 锯齿问题的起因 在三维模型的世界中&#xff0c;模型是连续的&#xff0c;但是屏幕像素是不连续&#xff0c;是离散的&#xff1b; 即当一个圆形显示在显…...

#git 问题failed to resolve head as a valid ref

问题如下&#xff1a; 解决方法&#xff1a; 1、运行 git fsck --full 可以查看具体error信息&#xff0c;一般都是head索引问题 2、.git\refs\heads\xxx&#xff08;当前分支&#xff09;txt编辑器打开显示乱码&#xff0c;而不是hash编码 3、在.git\logs\refs\heads\xxx&a…...

YOLOv11,地瓜RDK X5开发板,TROS端到端140FPS!

YOLOv11 Detect YOLOv11 Detect YOLO介绍性能数据 (简要) RDK X5 & RDK X5 Module 模型下载地址输入输出数据公版处理流程优化处理流程步骤参考 环境、项目准备导出为onnxPTQ方案量化转化使用hb_perf命令对bin模型进行可视化, hrt_model_exec命令检查bin模型的输入输出情况…...

Python精选200Tips:181-182

针对图像的经典卷积网络结构进化史及可视化 针对图像的经典卷积网络结构进化史及可视化&#xff08;续&#xff09;P181--MobileNet【2017】模型结构及创新性说明模型结构代码MobileNet V1版本MobileNet V2版本MobileNet V3 版本Small版本Large版本 P182--EfficientNet【2019】…...

SpringCloud 配置 feign.hystrix.enabled: true 不生效

SpringCloud 配置 feign.hystrix.enabled: true 不生效的原因 feign 启用 hystrix feign 默认没有启用 hystrix&#xff0c;添加配置&#xff0c;启用 hystrix feign.hystrix.enabledtrue application.yml 添加配置 feign:hystrix:enabled: true启用 hystrix 后&#xff0c;访…...

9.24-k8s服务发布

Ingress 使用域名发布 K8S 服务 部署项目 一、先部署mariadb [rootk8s-master ~]# mkdir aaa [rootk8s-master ~]# cd aaa/ [rootk8s-master aaa]# # 先部署mariadb [rootk8s-master aaa]# # configmap [rootk8s-master aaa]# vim mariadb-configmap.yaml apiVersion: v1 ki…...

UI设计师面试整理-作品集展示

在UI设计师的面试中,作品集展示是非常关键的一环。它不仅展示了你的设计技能和风格,也让面试官了解你的设计思维和解决问题的能力。下面是如何有效地准备和展示你的作品集的建议: 1. 选择合适的项目 ● 多样性:选择能展示你在不同领域或平台上的设计能力的项目。确保作品集…...

CMU 10423 Generative AI:lec10(few-shot、提示工程、上下文学习)

文章目录 1 概述2 摘录2.1 zero-shot 和 few-shot一、Zero-shot Learning&#xff08;零样本学习&#xff09;特点&#xff1a;工作原理&#xff1a;优点&#xff1a;缺点&#xff1a; 二、Few-shot Learning&#xff08;少样本学习&#xff09;特点&#xff1a;工作原理&#…...

做数据抓取工作要如何选择ip池

选择合适的IP池对于数据抓取工作至关重要。一个优质的IP池可以提高抓取的效率和成功率&#xff0c;同时减少被目标网站封禁的风险。以下是选择IP池时需要考虑的一些关键因素&#xff1a; 1. IP类型 住宅IP&#xff1a;住宅IP通常来自真实用户&#xff0c;难以被识别为代理。它…...

防止电脑电池老化,禁止usb或者ac接口调试时充电

控制android系统&#xff0c;开发者模式&#xff0c;开启和禁止充电 连接 Android 手机到电脑的 USB 端口。 下载并安装 Android Debug Bridge (ADB) 工具[1]。 USB&#xff1a; 在命令行中输入 adb shell dumpsys battery set usb 0&#xff0c;以禁止 USB 充电。 在命令…...

智权半导体/SmartDV力助高速发展的中国RISC-V CPU IP厂商走上高质量发展之道

作者&#xff1a;Karthik Gopal SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 进入2024年&#xff0c;全球RISC-V社群在技术和应用两个方向上都在加快发展&#xff0c;中国国内的RISC-V CPU IP提供商也在内核性能和应用扩展…...

利用vue-capper封装一个可以函数式调用图片裁剪组件

1. 效果 const cropData await wqCrop({prop:{img,autoCrop: true, // 是否开启截图框maxImgSize: 600,autoCropWidth: 30,canMove: true, // 图片是否可移动canMoveBox: true, // 截图框是否可移动fixedBox: false, // 截图框是否固定}});console.log(cropData);使用wqCrop会…...

在系统开发中提升 Excel 数据导出一致性与可维护性的统一规范与最佳实践

背景&#xff1a; 在系统开发过程中&#xff0c;数据导出为 Excel 格式是一个常见的需求。然而&#xff0c;由于各个开发人员的编码习惯和实现方式不同&#xff0c;导致导出代码风格不一。有的人使用第三方库&#xff0c;有的人则自定义实现。这种多样化不仅影响了代码的一致性…...

SpringAOP学习

面向切面编程&#xff0c;指导开发者如何组织程序结构 增强原始设计的功能 oop:面向对象编程 1.导入aop相关坐标&#xff0c;创建 <!--spring依赖--><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spri…...

智能网联汽车飞速发展,安全危机竟如影随形,如何破局?

随着人工智能、5G通信、大数据等技术的飞速发展&#xff0c;智能网联汽车正在成为全球汽车行业的焦点。特别是我国智能网联汽车市场规模近年来呈现快速增长态势&#xff0c;彰显了行业蓬勃发展的活力与潜力。然而&#xff0c;车联网技术的广泛应用也带来了一系列网络安全问题&a…...

浏览国外服务器的网站/百度推广电话销售好做吗

root用户删除文件提示&#xff1a;Operation not permitted http://blog.csdn.net/evanbai/article/details/6187578转载于:https://www.cnblogs.com/diyunpeng/p/7648537.html...

浙江省住房和城乡建设厅网站/重庆网络推广公司

1.利用时间戳来获得随机数 利用System.currentTimeMillis&#xff08;&#xff09;获得时间的位数&#xff0c;例如&#xff1a;个位&#xff0c;十位&#xff0c;百位…等等。 例如&#xff1a; int number1 (int)(System.currentTimeMillis() % 10); #获得时间个位数 int …...

网页制作处理中的三剑客/谷歌seo服务

下面列出IE和非IE中常见的一些js兼容性问题。 //window.event IE&#xff1a;有window.event对象 非IE&#xff1a;没有window.event对象。可以通过给函数的参数传递event对象。如οnmοusemοvedoMouseMove(event) 解除冒泡的方法不同 IE:window.event.cancelBubbletr…...

张家港网站建设培训/aso100官网

在人类遗传里面&#xff0c;近亲结婚生出的后代会伴随着各种疾病的并发&#xff0c;主要原因是近亲结婚提高了疾病的发病了&#xff0c;故而法律明文规定不可近亲结婚。但是对于鸽子来说&#xff0c;种鸽的近亲作育却能生出好的鸽子&#xff0c;虽然说种鸽的近亲作育也会生出一…...

网站开发需求分析word/免费网站友情链接

之前已经写过一篇关于Lucene安装学习的文章&#xff1a;http://www.cnblogs.com/charlesblc/p/5980525.html 还有一篇关于Solr安装使用的文章&#xff1a;http://www.cnblogs.com/charlesblc/p/5981292.html 上面两篇比较偏实践和应用&#xff0c;开了个头&#xff1b;这一篇是…...

肥城网站制作/seo网站排名优化价格

一、MDN文字样式知识点 1、font-family: 提供一个字体栈? font-family: "Trebuchet MS", Verdana, sans-serif; 不止一个单词&#xff0c;用引号包裹 2、font-size单位&#xff1a;px、em、rem &#xff08;1&#xff09;px&#xff1a;绝对单位 &#xff08;…...