C- 静态链接
静态链接意味着在编译时将所有库函数直接嵌入到最终的可执行文件中,而不是在运行时通过共享库来动态链接这些函数。静态链接的结果是一个更大的可执行文件,因为它包含了所有必要的代码,但它可以在没有外部依赖的情况下独立运行。
下面是一个使用静态链接的例子:
- 编写一个简单的库
我们首先创建一个简单的数学库 mymath.c:
# include "mymath.h"int add(int a, int b) {return a + b;
}
并为其创建一个头文件 mymath.h:
#ifndef MYMATH_H
#define MYMATH_Hint add(int a, int b);#endif
接下来,我们将这个库编译为一个静态库:
gcc -c mymath.c -o mymath.o
ar rcs libmymath.a mymath.o
上面的命令首先将 mymath.c 编译为一个对象文件 mymath.o,然后使用 ar 工具创建一个静态库 libmymath.a。
- 编写主程序
我们现在为主程序编写一个文件 main.c:
#include <stdio.h>
#include "mymath.h"int main() {printf("1 + 2 = %d\n", add(1, 2));return 0;
}
- 静态链接
我们使用以下命令静态链接主程序和库:
gcc main.c -L. -lmymath -o main
该命令使用 gcc 编译器将 main.c 源文件链接成一个名为 main 的可执行文件,并使用了一个在当前目录下的名为 libmymath.a 的静态库。让我们详细分解这个命令:
-
gcc: 这是使用的编译器命令。在这种情境下,gcc不仅仅是编译,还涉及到链接。 -
main.c: 这是源代码文件,它包含了程序的main()函数和可能还有其他代码。 -
-L.: 这是一个选项,告诉链接器在当前目录(.表示当前目录)下查找库。可以添加多个-L选项来指定多个搜索路径。 -
-lmymath: 这是另一个选项,告诉链接器链接一个名为libmymath.a的静态库。注意我们省略了 “lib” 前缀和文件扩展名.a。这是标准的命名和链接约定:库的名称以lib开头,但当链接它们时,通常省略这个前缀并使用-l选项。 -
-o main: 这个选项指定了输出文件的名称。在这种情况下,输出的可执行文件名为main。
所以,当这个命令执行后,gcc 编译器会将 main.c 源文件编译并链接,同时在当前目录下查找并链接 libmymath.a 静态库,最后生成一个名为 main 的可执行文件。
- 运行
现在,可以运行程序:
./main
它应该输出:
1 + 2 = 3
这个例子展示了如何创建、编译并静态链接一个简单的库。结果是一个不依赖于外部共享库的独立可执行文件。
ar 是一个用于创建、修改和从归档文件中提取对象文件的工具。在 Unix-like 系统上,静态库实际上就是一个包含了多个对象文件的归档文件。ar 是用于管理这些归档文件的标准工具。
当执行命令:
ar rcs libmymath.a mymath.o
实际上正在使用 ar 命令为一个静态库添加对象文件。让我们分解这个命令的各个部分:
-
ar: 这是命令本身,代表 “归档器”(archiver)。 -
rcs: 这是给ar的标志或选项,分别表示:r(replace): 添加或替换库中的对象文件。如果静态库libmymath.a已经存在,并且包含一个名为mymath.o的对象文件,那么这个对象文件将被替换。c(create): 创建静态库。如果libmymath.a还不存在,它将被创建。s(index): 构建对象文件索引。这允许链接器更快地链接到库,因为它可以直接查找所需的对象文件而无需搜索整个库。
-
libmymath.a: 这是要创建或修改的静态库的名称。 -
mymath.o: 这是要添加到静态库的对象文件。
执行此命令后,libmymath.a 将包含 mymath.o 对象文件。如果有多个对象文件,可以一次性将它们全部添加到库中,如:ar rcs libmymath.a obj1.o obj2.o obj3.o。
总的来说,ar rcs libmymath.a mymath.o 创建(或修改)一个名为 libmymath.a 的静态库,并添加(或替换)mymath.o 对象文件,同时为库构建一个索引,以加速后续的链接过程。
相关文章:
C- 静态链接
静态链接意味着在编译时将所有库函数直接嵌入到最终的可执行文件中,而不是在运行时通过共享库来动态链接这些函数。静态链接的结果是一个更大的可执行文件,因为它包含了所有必要的代码,但它可以在没有外部依赖的情况下独立运行。 下面是一个…...
微信公众号开发(BUG集)
1.微信公众平台接口错误:不合法的自定义菜单使用用户 地址:解决地址 2.微信公众平台接口错误:invalid ip 180.101.72.196 ipv6 ::ffff:180.101.72.196, not in whitelist rid: 6511420b-60c59249-01084d02 白名单离开放服务器IP...
AI项目十三:PaddleOCR训练自定义数据集
若该文为原创文章,转载请注明原文出处。 续上一篇,PaddleOCR环境搭建好了,并测试通过,接下来训练自己的检测模型和识别模型。 paddleocr检测模型训练 1、准备数据集 在PaddleOCR目录下新建文件夹:train_data, 这个…...
你熟悉Docker吗?
你熟悉Docker吗? 文章目录 你熟悉Docker吗?快速入门Docker安装1.卸载旧版2.配置Docker的yum库3.安装Docker4.启动和校验5.配置镜像加速5.1.注册阿里云账号5.2.开通镜像服务5.3.配置镜像加速 部署MySQL镜像和容器命令解读 Docker基础常用命令数据卷数据卷…...
Nodejs错误处理详细指南
Nodejs错误处理详细指南 学习 Node.js 中的高级错误处理技术,以增强应用程序的可靠性和稳定性。 在 Node.js 中,我们可以使用各种技术和方法来处理错误,可以查看这篇文章。错误处理是任何 Node.js 应用程序的一个重要方面。正确管理错误可以…...
软考 系统架构设计师系列知识点之软件架构风格
这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格(水平)考试,11月4号就要考试,因此8天长假绝不能荒废,必须要好好利用起来。现在将各个核心知识点一一进行提炼并做记录。 所…...
一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案
前言 如今进行入自媒体行业的人越来越多,短视频也逐渐成为了主流,但好多时候是想如何把视频里面的语音转成文字,比如,录制会议视频后,做会议纪要;比如,网课教程视频,想要做笔记&…...
[unity]对象的序列化
序 抽象的图纸叫类,包含具体数据的叫对象。 类的序列化和反序列化 using System.Collections; using System.Collections.Generic; using UnityEngine;using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializabl…...
java开发岗位面试
java开发岗位面试 技术栈:springboot框架+redis 个人笔试/技术面问题整理 1、SpringBoot有什么组件? 举例说几个: ①auto-configuration组件:核心特征。其约定大于配置思想,赋予了SpringBoot开箱即用的强…...
坠落防护 挂点装置
声明 本文是学习GB 30862-2014 坠落防护 挂点装置. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高处坠落防护挂点装置的技术要求、检验方法、检验规则及标识。 本标准适用于防护高处坠落的挂点装置。 本标准不适用于体育及消…...
关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理
概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置; 采用注解的方式可以让我们 固化配置,降低代码编写复杂度、减少配置错误情况的发生,提升编码调试的效率、提高业务的可用性。 为什么说“降低…...
uniapp快速入门系列(1)- 概述与基础知识
章节三:抖音小程序页面开发 第1章:概述与基础知识1.1 uniapp简介1.1.1 什么是uniapp?1.1.2 为什么选择uniapp?1.1.3 uniapp与微信小程序的关系 1.2 HBuilderX介绍与安装1.2.1 什么是HBuilderX?1.2.2 HBuilderX的安装1.…...
国密国际SSL双证书解决方案,满足企事业单位国产国密SSL证书要求
近年来,为了摆脱对国外技术和产品的依赖,建设安全的网络环境,以及加强我国对网络信息的安全可控能力,我国推出了国密算法。同时,为保护网络通信信息安全,更高级别的安全加密数字证书—国密SSL证书应运而生。…...
LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统
LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统 数字电子技术是所有电气专业的重要学科基础,具有很强的理论性和实践性。其实验是提高学生分析、设计和调试数字电路能力,培养学生解决实际问题的工程实践能力,激发学生创新意识&…...
机器学习之单层神经网络的训练:增量规则(Delta Rule)
文章目录 权重的调整单层神经网络使用delta规则的训练过程 神经网络以权值的形式存储信息,根据给定的信息来修改权值的系统方法称为学习规则。由于训练是神经网络系统地存储信息的唯一途径,因此学习规则是神经网络研究中的一个重要组成部分 权重的调整 (…...
C# Task任务详解
文章目录 前言Task返回值无参返回有参返回 async和await返回值await搭配使用Main async改造 Task进阶Task线程取消测试用例超时设置 线程暂停和继续测试用例 多任务等最快多任务全等待 结论 前言 Task是对于Thread的封装,是极其优化的设计,更加方便了我…...
百度网盘的扩容
百度网盘的扩容怎么扩 百度网盘的扩容通常需要购买额外的存储空间。以下是扩容百度网盘存储空间的一般步骤: 登录百度网盘:首先,在您的计算机或移动设备上打开百度网盘,并使用您的百度账号登录。 选择扩容选项:一旦登…...
Android 悬浮窗
本文参考文章地址:https://juejin.cn/post/7009180088310693919 一、申请权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />二、创建悬浮窗service <serviceandroid:name".FloatingWindowService"an…...
3.物联网射频识别,(高频)RFID应用ISO14443-2协议
一。ISO14443-2协议简介 1.ISO14443协议组成及部分缩略语 (1)14443协议组成(下面的协议简介会详细介绍) 14443-1 物理特性 14443-2 射频功率和信号接口 14443-3 初始化和防冲突 (分为Type A、Type B两种接口&…...
数据分析笔记1
数据分析概述:数据获取--探索分析与可视化--预处理--分析建模--模型评估 数据分析含义:利用统计与概率的分析方法提取有用的信息,最后进行总结与概括 一、数据获取 实用网站:kaggle 阿里云天池 数据仓库:将所有业务数据…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
