从零开始学习Linux(10)----动静态库

news2024/11/18 4:46:29

目录

1.制作静态库

1.编写源代码

2.编译

3.打包库

4.使用库

2.制作动态库

1.编译

2.打包库

3.总结

3.理解动态库加载

1.站在系统角度理解

2.谈谈编址,可执行程序


1.制作静态库

1.编写源代码

假设你编写了两个源代码文件mymath.c和myprintf.c以及它们对应的头文件。

2.编译

gcc -c mymath.c
gcc -c myprintf.c

将源文件编译为.o文件 。

3.打包库

ar -rc libmyc.a mymath.o myprintf.o

使用ar命令将两个.o文件打包为静态库,名称为去掉lib前缀和.a后缀的myc。

4.使用库

gcc main.c -lmyc -L .

如果你要在main.c中使用你的库,-lmyc指定你想要使用的库,-L .指定在当前目录下寻找库。

此时就可以运行你的main.c程序了!

2.制作动态库

1.编译

gcc -c -fPIC mymath.c
gcc -c -fPIC myprintf.c

fPIC为产生位置无关码

2.打包库

        shared:表示生成共享库格式

gcc -o main.c -I ./mylib/include

-I选项为可以在它指定的路径下搜索头文件

        静态库只要编译成功,动态库还需要运行成功,将库安装到系统中,既可以支持编译,又可以支持运行,有以下几种方法可以安装。

1.直接将库拷贝到系统中。

2.$LD_LIBRARY_PATH,该环境变量是系统运行程序时,动态库查找的辅助路径,将不再系统默认库搜索路径下的库路径,添加到LD_LIBRARY_PATH中。

3.通过软链接方式。

3.总结

        如果我们同时提供动态库和静态库,gcc默认使用的是动态库,如果我们非要静态连接,我们必须使用static选项,如果我们只提供静态库,那我们的可执行程序只能对该库进行静态连接,但是程序不一定整体是静态连接的,如果我们只提供动态库,默认只能动态连接,非得静态连接,会发生连接报错。

3.理解动态库加载

1.站在系统角度理解

        库函数的调用,依旧是在进程的地址空间中进行的,动态库加载之后,会被映射到进程的共享区中,谁来决定,那些库加载了,哪些库没加载:OS会自动完成。系统中可不可以同时存在非常多的已经加载的库呢?是,操作系统要管理库,先描述,再组织。本质:所有系统进程中公共的代码和数据,只需要存在一份。

2.谈谈编址,可执行程序

        可执行程序本身是有自己的格式信息的,我们进程地址空间里面的很多地址数据,是从可执行程序中来的,虚拟地址空间本身不仅是OS要遵守,编译器编译也要遵守,如果我们的可执行程序,没有被加载到内存中,我们的程序中没有地址呢:本来就有地址,其实我们的可执行程序,在没有加载之前,也已经基本被按照类别已经将可执行程序划分为各个区域了。   

  • 当动态库被加载时,它的代码和数据会被加载到物理内存中。
  • 动态库加载后,会被映射到该进程的地址空间中。具体来说,是先在页表中填写好对应虚拟地址和物理地址之间的映射关系,才被映射到进程地址空间中的共享区中。
  • 如果此时另一个进程也要加载该动态库,只需要填写它的页表的映射关系即可,不需要再从磁盘中加载一份动态库代码和数据,如果所需库不在内存中才需要加载。
  • 这样就保证了一个动态库最多只在内存中存在一份,大大节省了内存开销。

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

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

相关文章

数据平台发展史-从数据仓库数据湖到数据湖仓

做数据的同学经常听到一些数据相关的术语,常见的包括数据仓库,逻辑数据仓库,数据湖,数据湖仓/湖仓一体,数据网格 data mesh,数据编织 data fabric等. 笔者在这里回顾了下数据平台的发展史,也介绍和对比了下…

分享:Wordpress插件-AI Image Pro v2.6.0中文版语言包

AI Image Pro是一个wordpress插件,可将您的 WordPress 网站直接与最佳图像生成 A模型(DALL.E和稳定扩散)集成,并允许您利用 AI 生成图像、编辑(内画)图像和创建图像变体。最重要的是,它配备了许多一键式滤镜和许多微调选项,您可以使用它们来增强和创建令…

【JVM-1】JVM内存结构

目录 什么是JVMJava源码执行机制class文件的组成部分 JVM跨平台原理JVM的组成堆年轻代与老年代对象分配过程GC类型Full GC触发条件:对象进入老年代的触发条件 对象分配过程: 字符串常量池静态变量线程本地分配缓冲区(TLAB)TLAB相关…

昇思25天学习打卡营第3天 | 数据集 Dataset

数据是深度学习的基础,高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎,通过数据集(Dataset)和数据变换(Transforms)实现高效的数据预处理。其中Dataset是Pipel…

【M1/M2】详细说明Parallels Desktop虚拟机的安装使用

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明什么是Paralles Desktop一、基础环境说明1.1 硬件环境1.2 软件环境二、安装Parallels DeskTop2.1 下载软件安装包三、Parallels 下配置Windows 11 系统3.1 Windows 11安装3…

JavaScript学习笔记(四)

22、日期 JavaScript 日期输出,默认情况下,JavaScript 将使用浏览器的时区并将日期显示为全文本字符串: var data new Date();输出:Tue Jun 25 2024 14:45:44 GMT0800 (中国标准时间) 22.1 创建 Date 对象 Date 对象由新的 Da…

一键下单“鲜”到先得!生鲜电商小程序解决方案

随着消费者生活节奏的加快,以及移动互联网技术的普及,人们对于便捷、高效、个性化的生鲜购物体验需求日益旺盛。生鲜电商小程序以其独特的优势,正在改变着传统生鲜零售的格局,越来越多的消费者选择在线上购买生鲜食品,…

深圳比创达EMC|EMC与EMI滤波器:在电子设备中的平衡之道

随着科技的快速发展,电子设备已经深入到我们生活的方方面面,从家用电器到工业设备,从通信设备到医疗仪器,都离不开电子技术的支持。然而,电子设备在带来便利的同时,也面临着电磁兼容(EMC&#x…

全球最快的 JSON 文件查询工具

本文字数:1684;估计阅读时间:5分钟 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 介绍 在 ClickHouse,我们热衷于基准测试和性能优化。所以当我第一次看到 Hacker News 上那篇“查询大…

基于 JWT 进行身份验证

一、JWT 介绍 JWT 本质上就是一组字串,通过(.)切分成三个为 Base64 编码的部分: Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。Payload : 用来存放实际需要传递的数据Signature(签…

【系统架构师】-收官整理-已考过

目录 1、在2023年11月第一次考试 2、在2024年5月第二次考试 3、备考过程 3.1、综合知识 3.2、案例分析 3.3、论文 我是从2023年8月开始备考架构师考试,一边工作,一遍抽空学习(并没有参加培训)。 1、在2023年11月第一次考试…

word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法

问题描述:word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。设置了页边距也不管用。 如图1 图1 解决: 点击“视图”——“多页”——“单页”,即可。如图2操作 图2 结果展示:如图3 图3

Springboot小型仪器公司生产管理系统-计算机毕业设计源码031853

摘 要 本论文主要论述了如何使用java语言开发一个Springboot小型仪器公司生产管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述小型仪器公司生产管理系统…

SV std::randomize使用技巧与指南

通过以下例子学习: 其它: 里面夹杂: if(en1) { ((a>b)&&(b>c) || (e>f)&&(j>k)); } else { }

如何提高搜索点击率:五个利用ChatGPT创造吸引眼球标题的小技巧

在当今信息爆炸的时代,如何让自己的文章在海量信息中脱颖而出,是每个内容创作者都在思考的问题。尤其是当读者面对无数个搜索结果时,标题成为吸引他们点击的第一步。那么,如何才能写出吸引眼球的标题,从而提高搜索点击…

星戈瑞DSPE-FITC在细胞标记中的应用

细胞标记是生物医学研究中的一项基本技术,它允许研究者追踪和观察细胞的行为、分布以及与周围环境的相互作用。在众多的细胞标记方法中,DSPE-FITC因其独特的性质和应用范围而受关注。 DSPE-FITC的基本性质 DSPE-FITC是由二硬脂酰磷脂酰乙醇胺&#xff0…

【消息队列】RabbitMQ集群原理与搭建

目录 前言1、集群搭建1.1、安装RabbitMQ1.1.1、前置要求1.1.2、安装Erlang环境①创建yum库配置文件②加入配置内容③更新yum库④正式安装Erlang 1.1.3、安装RabbitMQ1.1.4、RabbitMQ基础配置1.1.5、收尾工作 1.2、克隆VMWare虚拟机1.2.1、目标1.2.2、克隆虚拟机1.2.3、给新机设…

Mybatis 到 MyBatisPlus

Mybatis 到 MyBatisPlus Mybatis MyBatis(官网:https://mybatis.org/mybatis-3/zh/index.html )是一款优秀的 持久层 (ORM)框架,用于简化JDBC的开发。是 Apache的一个开源项目iBatis,2010年这…

vscode关于java扩展

包含IDEA同款代码提示,vscode的debug,除了创建类要手动新建java文件以外,其他都还行,满足初学者要求。

免费插件集-illustrator插件-Ai插件-测量路径周长

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,进行测量路径周长处理。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&…