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将会占用较大的磁盘空间。
而当有多个进程同时调用同一个函数时,那每一个进程的可执行文件都将包含一份被调函数的副本,这又会造成系统内存负担过重。

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

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

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

相关文章

AMSR-E L2 降雨子集:GES DISC 的 CloudSat 轨道 V002 (AMSERR_CPR) 位于同一地点

AMSR-E L2 Rainfall Subset, collocated with CloudSat track V002 (AMSERR_CPR) at GES DISC AMSR-E L2 降雨子集&#xff0c;与位于 GES DISC 的 CloudSat 轨道 V002 (AMSERR_CPR) 位于同一地点 简介 这是沿云卫星视场轨迹的 AMSR-E 雨率产品子集。子集的目标是选择并返回…

PaddleVideo:Squeeze Time算法移植

参考PaddleVideo/docs/zh-CN/contribute/add_new_algorithm.md at develop PaddlePaddle/PaddleVideo GitHubAwesome video understanding toolkits based on PaddlePaddle. It supports video data annotation tools, lightweight RGB and skeleton based action recognitio…

分类模型的算法性能评价

一、概述 分类模型是机器学习中一种最常见的问题模型&#xff0c;在许多问题场景中有着广泛的运用&#xff0c;是模式识别问题中一种主要的实现手段。分类问题概况起来就是&#xff0c;对一堆高度抽象了的样本&#xff0c;由经验标定了每个样本所属的实际类别&#xff0c;由特定…

List、Map、Set 接口在Java中的存取元素特点

List、Map、Set 接口在Java中的存取元素特点 1、List 接口2、Map 接口3、Set 接口4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;List、Map和Set是三个最常用的集合接口。它们各自有不同的特点和用途&#xff…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解&#xff1a; netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…

我的FPGA

1.安装quartus 2.更新usb blaster驱动 3.新建工程 1.随便找一个文件夹&#xff0c;里面新建demo文件夹&#xff0c;表示一个个工程 在demo文件夹里面&#xff0c;新建src&#xff08;源码&#xff09;&#xff0c;prj&#xff08;项目&#xff09;&#xff0c;doc&#xff…

LLM 研究方向(一): LLM Prompts--p-tuning、LoRA

目录 1. prompt-tuning background 2. Prompt Tuning 模型介绍 2.1 2021 prefix-tuning 2.2 2021 P-tuning v1 2.3 2021 Parameter-efficient prompt tuning (PET) 2.4 2022 P-tuning v2 2.5 2019 Adapter ​2.6 2021 LoRA (Low-Rank Adaptation) 2.7 2024 DoRA (…

VS Code 配置 C/C++ 编程运行环境(保姆级教程)

文章目录 一、软件下载1. 下载 VS Code 安装工具 2. 下载 MinGW-W64二、安装 VS Code三、安装 MinGW-W64 及配置环境变量四、配置 VS Code 的 C/C 编程运行环境1. 汉化 VS Code&#xff08;选做&#xff09;2. 安装 C/C 扩展包 五、测试 VS Code 的 C/C 编程环境1. 创建代码文件…

PowerShell install 一键部署mysql 9.0.0

mysql 前言 MySQL 是一个基于 SQL(Structured Query Language)的数据库系统,SQL 是一种用于访问和管理数据库的标准语言。MySQL 以其高性能、稳定性和易用性而闻名,它被广泛应用于各种场景,包括: Web 应用程序:许多动态网站和内容管理系统(如 WordPress)使用 MySQL 存…

14-65 剑和诗人39 - 打造你自己的 Devin

​​​​​ 绝密 Devin 架构 更具体地说,构建您自己的 AI 代理。 Devin 使用 GPT-4 ,而人们已经开始用 Claude-3-Opus 构建替代方案 Devin 的 UI 体验更好。 例如,它甚至看不到浏览器,但它确实存在于用户面前 此外,你可以随时与它“交谈”,就像与人交谈一样,它会在后…

基于单片机的温湿度感应智能晾衣杆系统设计

&#xff3b;摘 要&#xff3d; 本设计拟开发一种湿度感应智能晾衣杆系统 &#xff0c; 此新型晾衣杆是以单片机为主控芯片 来控制的实时检测系统 &#xff0e; 该系统使用 DHT11 温湿度传感器来检测大气的温湿度 &#xff0c; 然后通过单 片机处理信息来控制 28BYJ &…

Linux——多线程(五)

1.线程池 1.1初期框架 thread.hpp #include<iostream> #include <string> #include <unistd.h> #include <functional> #include <pthread.h>namespace ThreadModule {using func_t std::function<void()>;class Thread{public:void E…

申请商标用什么颜色:企业和个人申请注册商标攻略!

在申请注册商标到底要用什么颜色&#xff0c;许多初次申请注册主体都不是特别清楚&#xff0c;普推知产商标老杨建议&#xff0c;在一般情况下建议尽量用黑白色&#xff0c;因为商标用黑白色在使用时可以着任何色。 在用黑色申请注册成功&#xff0c;别的主体用其它颜色要在同…

区域特征检测工具的使用

区域特征检测工具的使用 选择区域-》右键-》工具->特征检测

C 语言中如何进行冒泡排序?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

华为od100问持续分享-1

我是一名软件开发培训机构老师&#xff0c;我的学生已经有上百人通过了华为OD机试&#xff0c;学生们每次考完试&#xff0c;会把题目拿出来一起交流分享。 重要&#xff1a;2024年5月份开始&#xff0c;考的都是OD统一考试&#xff08;D卷&#xff09;&#xff0c;题库已经整…

CentOS6用文件配置IP模板

CentOS6用文件配置IP模板 到 CentOS6.9 , 默认还不能用 systemctl , 能用 service chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 ### chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 sudo chkconfig sshd onservice sshd start …

grep对文件内容搜索(附重要拓展-正则表达式)

文件搜索是搜索查找符合条件的某文件的目录&#xff0c;若要编辑文件或对文件的某配置进行修改&#xff0c;就需要对文件内容进行搜索。 grep 命令是 Linux 及类 Unix 操作系统中的一个强大的文本搜索工具&#xff0c;用于搜索一个或多个文件中匹配给定模式的行。grep 代表“Gl…

Linux进程管理Part2

Linux进程控制Part2 文章目录 Linux进程控制Part2Fork()函数详解简单描述 fork函数的使用进程退出的方式_exit函数exit函数return 退出 进程等待进程等待的方法 kill的使用进程替换简单描述命名原理 END Fork()函数详解 FORK(2) Linux Programmer’s Manual FORK(2) NAME for…

53-4 内网代理6 - frp搭建三层代理

前提:53-3 内网代理5 - frp搭建二级代理-CSDN博客 三级网络代理 在办公区入侵后,发现需要进一步渗透核心区网络(192.168.60.0/24),并登录域控制器的远程桌面。使用FRP在EDMZ区、办公区与核心区之间建立三级网络的SOCKS5代理,以便访问核心区的域控制器。 VPS上的FRP服…