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

目录

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.mzph.cn/bicheng/37122.shtml

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

相关文章

乐队谱在哪里找 乐队功能谱怎么做 Guitar Pro8激活码 吉他谱软件

学习乐队谱对于音乐爱好者来说是一种极具乐趣和挑战的体验。无论是追溯经典曲目还是与其他乐手合作,乐队谱都是实现音乐梦想的必备工具。然而,要找到适合练习的乐队谱并制作出符合乐队演奏需求的功能谱并不容易,需要借助一些方法和工具。下面…

java根据cron表达式获取上次或者下次执行时间(考虑每月天数)

** 一 cron 表达式相关 例如[0 0 0 1 * ?,59 59 23 L * ?]每月1日凌晨开启,每月月末23点59分59秒结束 先获取每次执行间隔差值,然后模拟一次一次触发,找到应该触发的时间点 ** 获取上次执行时间 /*** 上次执行时间* param cronInfo* return*/ publi…

点云入门知识

点云的处理任务 场景语义分割 物体的三维表达方法(3D representations): 点云:是由物体表面上许多点数据来表征这个物体。最接近原始传感器数据,且具有丰富的几何信息。 Mesh:用三角形面片和正方形面片拼…

【安全开发】内网扫描器

文章目录 前言现实现的功能较少后序开发会逐步加入简单漏洞探探测和代理功能。 一、开发过程1.项目结构2.main.go3.core模块3.1 scanner.go3.2 service.go 4.bruteforc4.1 bruteforce.go 二、使用步骤 前言 为什么要写这个? fscna被杀的概率太高(哪天二…

十步学习法,赋能程序员

大家好,我是码农先森。 引言 最近看了《软技能:代码之外的生存指南》这本书,对其中的 “十步学习法”。 有一些感触,所以将其中的内容记录并总结了下来,分享给大家。 程序员在学习成长的过程中,除了关注…

phpword生成PDF

接上一篇phpword生成word文档,如有不明白的问题可以先查看上一篇文章 首先,生成PDF需要先生成word文档,而后通过word文档生成HTML文档,最后才可以通过HTML文档生成PDF文件,详细代码如下。 执行命令安装phpword&#…

【深度学习】单机多卡 | DataParallel将计算任务在多个 GPU 上并行执行,可以在多个 GPU 上分摊工作负载,从而加快训练速度

【深度学习】单机多卡 | DataParallel将计算任务在多个 GPU 上并行执行,可以在多个 GPU 上分摊工作负载,从而加快训练速度 写在最前面DataParallel (DP) 简介使用 DataParallel 的场景使用 DataParallel 的基本步骤 代码部分train.py简单的代码示例代码解…

可用的微信小程序抓包方式(Charles + bp)

扫码领资料 获网安教程 前言 接到对公司小程序进行渗透的任务,尝试了网上几种对小程序抓包的方式(BurpProxifier、Burp安卓模拟器等)都无法完成抓包,可能已经失效,结合不同的文章尝试了bpCharles,成功抓包…

diffusion model(十八):diffusion model中negative prompt的工作机制

info个人博客主页http://myhz0606.com/article/ncsn 前置阅读: DDPM: http://myhz0606.com/article/ddpm classifier-guided:http://myhz0606.com/article/guided classifier-free guided:http://myhz0606.com/article/classi…

SANGFOR深信服配置短信验证全流程

登录管理平台: 打开浏览器,输入管理平台地址(例如:http://192.168.0.1)。输入管理员账号和密码,点击“登录”。 配置认证策略: 导航到“认证” -> “认证策略”。点击“新建策略”。选择“验…

如何评估CRM客户系统的功能是否满足助贷机构的需求?

评估 CRM 客户系统的功能是否满足助贷机构的需求,可以从以下几个方面入手: 1. 客户信息管理 - 检查系统能否全面、准确地记录客户的基本信息,如个人身份、财务状况、贷款需求等。 - 确认是否支持多维度的客户分类和标签功能,以…

《妃梦千年》第十四章-第十五章:重重困局,风云再起

第十四章:重重困局 林清婉和皇上的关系日益亲密,但宫中的局势却依然复杂多变。一天夜里,林清婉正在寝宫中思考未来的对策,忽然接到一个紧急消息。小翠匆匆跑来,神色紧张:“娘娘,边疆的将军送来…

LeetCode:经典题之876、143 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …

pdfmake不能设置表格边框颜色?

找到pdfmake>build>pdfmake.js中: 找到定义的“TableProcessor.prototype.drawVerticalLine”和“TableProcessor.prototype.drawHorizontalLine”两个方法: 重新定义borderColor: var borderColor this.tableNode.table.borderColor||"#…

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数: 函数二 函数三 主函数 运行结果 src: model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征,实现高准确度的身份识别。…

【工具测评】ONLYOFFICE8.1版本桌面编辑器测评:好用!

随着远程工作的普及和数字化办公的发展,越来越多的人开始寻找功能强大、易于使用的办公软件。在这个背景下,ONLYOFFICE 8.1应运而生,成为许多用户的新选择。ONLYOFFICE 8.1是一款办公套件软件,提供文档处理、电子表格和幻灯片制作…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-41目标检测数据集

41目标检测数据集 import os import pandas as pd import torch import torchvision import matplotlib.pylab as plt from d2l import torch as d2l# 数据集下载链接 # http://d2l-data.s3-accelerate.amazonaws.com/banana-detection.zip# 读取数据集 #save def read_data_b…

6.28U-Net深度学习基准模型特点与应用

U-Net深度学习基准模型特点与应用 U-Net是一种在深度学习领域广泛应用于图像分割任务的卷积神经网络(CNN)模型,最初由Olaf Ronneberger、Philipp Fischer和Thomas Brox在2015年的论文《U-Net: Convolutional Networks for Biomedical Image …

右键新建没有TXT文本文档的解决办法

电脑右键新建,发现没有txt了,我查网上办法都有点复杂,诸如注册表的,但是其实很简单,重启windows资源管理器就可以了。 点击重新启动,之后新建就有txt文档了。

C++20中的Feature Test Mocros

C20定义了一组预处理器宏,用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制,用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现,它使你能够在编译过程中仔细…