2-1静态库

静态库制作

编写库文件

test.c

#include<stdio.h>
int main(void){
	printf("%d\n",add(3,5));
	return 0;
}

add.c

int add(int a,int b){
	return a+b;
}

生成.o(目标文件)

在这里插入图片描述
在这里插入图片描述

用nm查看.o文件

在这里插入图片描述
T代表add这个函数的链接性是外部链接,即全局可见,可被其它函数访问

创建库文件

ar rc 1ibtest.a 130la.o、1301b.o

命令的解释如下:
ar:这是归档工具的命令。
rc:选项rc用于创建一个新的归档文件,并添加文件到其中。r代表插入(replace),c代表创建(create)。
1ibtest.a:这是要创建的静态库文件的名称,.a扩展名表示这是一个静态库文件。
add.c是要被添加到静态库中的编译后的源代码文件。

链接库

gcc 1301.c -L. -ltest
-L.:这是gcc的一个选项,表示链接器应该在当前目录(.)下搜索库文件。-L选项后面通常跟的是库文件的路径,这里指定为当前目录。

-ltest:这是告诉gcc链接器链接名为libtest的库(库文件的命名约定通常是lib开头,.a或.so结尾,例如libtest.a或libtest.so)。-l选项后面跟的是库的名称,不包括前缀lib和后缀。.a一般是静态库,.so一般是动态库。

如果libtest.a或libtest.so存在于当前目录下,gcc将会链接这个库到最终的可执行文件中。如果库文件不存在,编译过程可能会报错,提示找不到库文件。
链接库之后出现warning,但是仍然可以生成可执行文件,warning的大概意思就是说add()这个函数在main函数中没有显性声明,而之所以不报错的原因在于gcc编译器会自动帮你补充声明
在这里插入图片描述
但是我们仍然可以在test.c中声明一下,看看声明以后的链接库的结果
在这里插入图片描述
不会warning

执行a.out

输出8

比较链接前后add函数的地址

在这里插入图片描述在这里插入图片描述
可以看到add函数被链接之后被分配了内存,而其它的变量与函数也是一样的,在链接之后分配内存,然后,执行文件便可以通过地址去调用和访问它们
在这里插入图片描述

查看libtest.a

在这里插入图片描述
可以看到库里包含add.o文件,对于其中的函数add()还没有分配内存

添加新文件到库

编写sub库函数

int sub(int a,int b){
	return a-b;
}

生成sub目标文件

在这里插入图片描述
在这里插入图片描述

将sub.o添加到原有的库libtest.a

在这里插入图片描述

nm查看libtest.a

在这里插入图片描述
可以看出这个库中的文件多了一个,但是他们的函数都没有被分配内存

再次链接

在这里插入图片描述

再次执行

输出8和-2符合与其输出
在这里插入图片描述

总结

执行test.c文件,链接文件去链接需要的变量和函数,当链接到add()和sub()时就去libtest.a静态库中寻找对应的符号(包含变量和函数)),通过这个符号便可以确定代码段的地址,再将地址填入调入指令。

静态库的的缺点

在a.out可执行文件中包含了所有test.c需要的文件,所以a.out将会占用较大的磁盘空间。
而当有多个进程同时调用同一个函数时,那每一个进程的可执行文件都将包含一份被调函数的副本,这又会造成系统内存负担过重。

注:诸位站友如有所收获不如点个免费的赞,如有错误之处或有其它补充的点,请在评论区发表你的观点或者私信,看到必回。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从两眼放光到心碎一地《长相思》第二季搞笑爱情转折

这《长相思》第二季的剧情&#xff0c; 简直是心脏按摩器升级版啊&#xff01; 爷爷一开口&#xff0c;要给玱玹安排馨悦当王后 我这小心脏差点就跟着‘嘭’一声 "哎呀&#xff0c;以为要上演宫廷版《速度与激情》 结果小夭女神一出手&#xff0c; 不是醋坛子翻&#…

信创:鲲鹏(arm64)+麒麟(kylin v10)离线部署k8s和kubesphere(含离线部署新方式)

本文将详细介绍&#xff0c;如何基于鲲鹏CPU(arm64)和操作系统 Kylin V10 SP2/SP3&#xff0c;利用 KubeKey 制作 KubeSphere 和 Kubernetes 离线安装包&#xff0c;并实战部署 KubeSphere 3.3.1 和 Kubernetes 1.22.12 集群。 服务器配置 主机名IPCPUOS用途master-1192.168.10…

600Kg大载重起飞重量多旋翼无人机技术详解

600Kg大载重起飞重量的多旋翼无人机是一种高性能的无人驾驶旋翼飞行器&#xff0c;具有出色的载重能力和稳定的飞行特性。该无人机采用先进的飞行控制系统和高效的动力系统&#xff0c;能够满足各种复杂任务的需求&#xff0c;广泛应用于物资运输、应急救援、森林防火等领域。 …

视语坤川大模型智能体平台亮相2024世界人工智能大会

7月4日-7月7日&#xff0c;以“以共商促共享以善治促善智”为主题的2024世界人工智能大会&#xff08;WAIC 2024&#xff09;在上海举办&#xff0c;世界顶级专家学者、知名企业代表、政界人士、高校组织等齐聚上海&#xff0c;共商发展、共话未来。 作为大会的重磅环节——昇…

逻辑运算及其基本概念,定理,算法,规律,卡诺图

逻辑运算及其基本概念&#xff0c;定理&#xff0c;算法&#xff0c;规律&#xff0c;卡诺图 文章目录 逻辑运算及其基本概念&#xff0c;定理&#xff0c;算法&#xff0c;规律&#xff0c;卡诺图开胃小菜运算1、与运算2、或运算3、非运算4、与非&#xff08;都1时为0&#xf…

Science|N型半导体水凝胶(柔性半导体器件/柔性健康监测/导电水凝胶/柔性电子)

2024年5月2日,北京大学雷霆(Ting Lei)课题组在《Science》上发布了一篇题为“N-type semiconducting hydrogel”的论文。论文内容如下: 一、 摘要 水凝胶是一类具有可调机械性能、多样生化功能和良好离子导电性的生物界面材料,但由于缺乏半导体特性,使得水凝胶在电子学中…

数据跨境传输法规日趋完善,企业如何规避合规风险?

随着全球化的发展&#xff0c;跨境数据传输变得日益频繁。在数字化时代&#xff0c;数据安全是企业运营的关键。数据跨境传输由于涉及不同国家和地区&#xff0c;其安全合规性面临着更大的风险和挑战。 2022年&#xff0c;国家网信办发布了《数据出境安全评估办法》&#xff08…

灭世男孩

《血腥复仇与反乌托邦之旅&#xff1a;<灭世男孩>的暴力美学盛宴》 在众多电影的海洋中&#xff0c;有一部独特而引人注目的作品——《灭世男孩》。这部由德国、南非和美国联合制作的电影&#xff0c;以其独特的风格、精彩的动作场面和深刻的主题&#xff0c;为观众带来了…

理解负载组电路-EAK负载电路解释

负载组具有安全、可靠、操作方便、使用寿命长等特点。了解控制、冷却和负载元件电路的布局和功能对于理解负载组的运行、为应用选择负载组和维护负载组非常重要。以下各节将描述这些电路。 EAK负荷组运行概述 负载组接收来自电源的电力&#xff0c;将其转换为热量&#xff0c;…

Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析

章节内容 上一节我们完成了内容&#xff1a; Flume 启动测试Flume Conf编写Flume 测试发送和接收数据 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但…

[AI 大模型] Meta LLaMA-2

文章目录 [AI 大模型] Meta LLaMA-2简介模型架构发展新技术和优势示例 [AI 大模型] Meta LLaMA-2 简介 Meta LLaMA-2 是 Meta 推出的第二代开源大型语言模型&#xff08;LLM&#xff09;&#xff0c;旨在为研究和商业应用提供强大的自然语言处理能力。 LLaMA-2 系列模型包括从…

数电基础 - 数制,码制

目录 一. 简介 数制 码制 二. 进制 十进制&#xff08;Decimal&#xff09;&#xff1a; 二进制&#xff08;Binary&#xff09;&#xff1a; 八进制&#xff08;Octal&#xff09;&#xff1a; 十六进制&#xff08;Hexadecimal&#xff09;&#xff1a; 三. 进制的转…

WPF 初识依赖属性

依赖属性的意义和作用 核心模块内存共享&#xff0c;节省空间数据绑定、样式、模板、动画。。。。如果没有依赖属性&#xff0c;这个框架就是一个控件框架 相当于Winform 依赖属性的基本定义 基本过程&#xff1a;声明、注册、包装 在需要写依赖属性的类中&#xff0c;继承…

【EI稳定检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

>>>【独立出版&#xff0c;Ei稳定检索】<<< 第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024年09月20-22日 | 中国温州 一轮截稿时间&#xff1a;2024年7月8日 二轮截稿时间&#xff1a;2024年8月5日 大会简介 *会议…

深度学习之梯度消失

在深度学习中&#xff0c;梯度消失是指在反向传播过程中&#xff0c;随着网络层数增加或者在使用特定类型的激活函数&#xff08;如sigmoid函数&#xff09;时&#xff0c;梯度逐渐变小并最终趋近于零的现象。这种现象导致在更新参数时&#xff0c;底层网络的权重几乎不会得到有…

RSRS研报复现——年化21.5%,含RSRS标准分,右偏标准分的Backtrader指标计算(代码+数据)

原创文章第583篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 继续Backtrader&#xff0c;今天讲讲指标扩展。 作为规则型的量化框架&#xff0c;指标是非常重要的元素&#xff0c;它是策略的基础。 我们来扩展一个经典的指标&#xff0c;RSR…

解决:Flink向kafka写数据使用Producer精准一次(EXACTLY_ONCE)异常

在使用flink向kafka写入数据报错&#xff1a;Caused by: org.apache.kafka.common.KafkaException: Unexpected error in InitProducerIdResponse; The transaction timeout is larger than the maximum value allowed by the broker (as configured by transaction.max.timeou…

【云岚到家】-day05-2-预约下单-系统开发

【云岚到家】-day05-2-预约下单-系统开发 1 预约下单系统开发1.1 订单号生成规则1.1.1 常见的订单号生成规则1.1.2 本项目订单号生成规则1.1.3 代码实现 1.2 下单接口实现1.2.1 Mapper实现1.2.2 Service实现1.2.3 Controller1.2.4 测试 1.3 下单代码优化1.3.1 事务方法存在远程…

自动化一些操作

下拉选择框 from selenium import webdriver from time import sleep # 导包 from selenium.webdriver.support.select import Select driver webdriver.Edge() driver.get(r"D:\WORK\ww\web自动化_day01_课件笔记资料代码\web自动化_day01_课件笔记资料代码\02_其他资料…

Collection接口及遍历集合的方式Iterator接口、增强for循环的介绍和使用

Collection接口 概述&#xff1a;单列集合的顶级接口格式&#xff1a;其中泛型决定了集合中能存储什么类型的数据&#xff0c;可以统一元素类型&#xff0c;泛型中只能写引用数据类型&#xff0c;如果不写&#xff0c;默认Object类型。等号前面的泛型必须写&#xff0c;等号后…