当前位置: 首页 > news >正文

C- 静态链接

静态链接意味着在编译时将所有库函数直接嵌入到最终的可执行文件中,而不是在运行时通过共享库来动态链接这些函数。静态链接的结果是一个更大的可执行文件,因为它包含了所有必要的代码,但它可以在没有外部依赖的情况下独立运行。

下面是一个使用静态链接的例子:

  1. 编写一个简单的库

我们首先创建一个简单的数学库 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

  1. 编写主程序

我们现在为主程序编写一个文件 main.c

#include <stdio.h>
#include "mymath.h"int main() {printf("1 + 2 = %d\n", add(1, 2));return 0;
}
  1. 静态链接

我们使用以下命令静态链接主程序和库:

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 的可执行文件。

  1. 运行

现在,可以运行程序:

./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- 静态链接

静态链接意味着在编译时将所有库函数直接嵌入到最终的可执行文件中&#xff0c;而不是在运行时通过共享库来动态链接这些函数。静态链接的结果是一个更大的可执行文件&#xff0c;因为它包含了所有必要的代码&#xff0c;但它可以在没有外部依赖的情况下独立运行。 下面是一个…...

微信公众号开发(BUG集)

1.微信公众平台接口错误:不合法的自定义菜单使用用户 地址&#xff1a;解决地址 2.微信公众平台接口错误:invalid ip 180.101.72.196 ipv6 ::ffff:180.101.72.196, not in whitelist rid: 6511420b-60c59249-01084d02 白名单离开放服务器IP...

AI项目十三:PaddleOCR训练自定义数据集

若该文为原创文章&#xff0c;转载请注明原文出处。 续上一篇&#xff0c;PaddleOCR环境搭建好了&#xff0c;并测试通过&#xff0c;接下来训练自己的检测模型和识别模型。 paddleocr检测模型训练 1、准备数据集 在PaddleOCR目录下新建文件夹&#xff1a;train_data, 这个…...

你熟悉Docker吗?

你熟悉Docker吗&#xff1f; 文章目录 你熟悉Docker吗&#xff1f;快速入门Docker安装1.卸载旧版2.配置Docker的yum库3.安装Docker4.启动和校验5.配置镜像加速5.1.注册阿里云账号5.2.开通镜像服务5.3.配置镜像加速 部署MySQL镜像和容器命令解读 Docker基础常用命令数据卷数据卷…...

Nodejs错误处理详细指南

Nodejs错误处理详细指南 学习 Node.js 中的高级错误处理技术&#xff0c;以增强应用程序的可靠性和稳定性。 在 Node.js 中&#xff0c;我们可以使用各种技术和方法来处理错误&#xff0c;可以查看这篇文章。错误处理是任何 Node.js 应用程序的一个重要方面。正确管理错误可以…...

软考 系统架构设计师系列知识点之软件架构风格

这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;11月4号就要考试&#xff0c;因此8天长假绝不能荒废&#xff0c;必须要好好利用起来。现在将各个核心知识点一一进行提炼并做记录。 所…...

一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案

前言 如今进行入自媒体行业的人越来越多&#xff0c;短视频也逐渐成为了主流&#xff0c;但好多时候是想如何把视频里面的语音转成文字&#xff0c;比如&#xff0c;录制会议视频后&#xff0c;做会议纪要&#xff1b;比如&#xff0c;网课教程视频&#xff0c;想要做笔记&…...

[unity]对象的序列化

序 抽象的图纸叫类&#xff0c;包含具体数据的叫对象。 类的序列化和反序列化 using System.Collections; using System.Collections.Generic; using UnityEngine;using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializabl…...

java开发岗位面试

java开发岗位面试 技术栈&#xff1a;springboot框架&#xff0b;redis 个人笔试/技术面问题整理 1、SpringBoot有什么组件&#xff1f; 举例说几个&#xff1a; ①auto-configuration组件&#xff1a;核心特征。其约定大于配置思想&#xff0c;赋予了SpringBoot开箱即用的强…...

坠落防护 挂点装置

声明 本文是学习GB 30862-2014 坠落防护 挂点装置. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高处坠落防护挂点装置的技术要求、检验方法、检验规则及标识。 本标准适用于防护高处坠落的挂点装置。 本标准不适用于体育及消…...

关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理

概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置&#xff1b; 采用注解的方式可以让我们 固化配置&#xff0c;降低代码编写复杂度、减少配置错误情况的发生&#xff0c;提升编码调试的效率、提高业务的可用性。 为什么说“降低…...

uniapp快速入门系列(1)- 概述与基础知识

章节三&#xff1a;抖音小程序页面开发 第1章&#xff1a;概述与基础知识1.1 uniapp简介1.1.1 什么是uniapp&#xff1f;1.1.2 为什么选择uniapp&#xff1f;1.1.3 uniapp与微信小程序的关系 1.2 HBuilderX介绍与安装1.2.1 什么是HBuilderX&#xff1f;1.2.2 HBuilderX的安装1.…...

国密国际SSL双证书解决方案,满足企事业单位国产国密SSL证书要求

近年来&#xff0c;为了摆脱对国外技术和产品的依赖&#xff0c;建设安全的网络环境&#xff0c;以及加强我国对网络信息的安全可控能力&#xff0c;我国推出了国密算法。同时&#xff0c;为保护网络通信信息安全&#xff0c;更高级别的安全加密数字证书—国密SSL证书应运而生。…...

LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统

LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统 数字电子技术是所有电气专业的重要学科基础&#xff0c;具有很强的理论性和实践性。其实验是提高学生分析、设计和调试数字电路能力&#xff0c;培养学生解决实际问题的工程实践能力&#xff0c;激发学生创新意识&…...

机器学习之单层神经网络的训练:增量规则(Delta Rule)

文章目录 权重的调整单层神经网络使用delta规则的训练过程 神经网络以权值的形式存储信息,根据给定的信息来修改权值的系统方法称为学习规则。由于训练是神经网络系统地存储信息的唯一途径&#xff0c;因此学习规则是神经网络研究中的一个重要组成部分 权重的调整 &#xff08…...

C# Task任务详解

文章目录 前言Task返回值无参返回有参返回 async和await返回值await搭配使用Main async改造 Task进阶Task线程取消测试用例超时设置 线程暂停和继续测试用例 多任务等最快多任务全等待 结论 前言 Task是对于Thread的封装&#xff0c;是极其优化的设计&#xff0c;更加方便了我…...

百度网盘的扩容

百度网盘的扩容怎么扩 百度网盘的扩容通常需要购买额外的存储空间。以下是扩容百度网盘存储空间的一般步骤&#xff1a; 登录百度网盘&#xff1a;首先&#xff0c;在您的计算机或移动设备上打开百度网盘&#xff0c;并使用您的百度账号登录。 选择扩容选项&#xff1a;一旦登…...

Android 悬浮窗

本文参考文章地址&#xff1a;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协议组成及部分缩略语 &#xff08;1&#xff09;14443协议组成&#xff08;下面的协议简介会详细介绍&#xff09; 14443-1 物理特性 14443-2 射频功率和信号接口 14443-3 初始化和防冲突 &#xff08;分为Type A、Type B两种接口&…...

数据分析笔记1

数据分析概述&#xff1a;数据获取--探索分析与可视化--预处理--分析建模--模型评估 数据分析含义&#xff1a;利用统计与概率的分析方法提取有用的信息&#xff0c;最后进行总结与概括 一、数据获取 实用网站&#xff1a;kaggle 阿里云天池 数据仓库&#xff1a;将所有业务数据…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...