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 阿里云天池 数据仓库:将所有业务数据…...
SQLite.Interop.DLL加载失败的3种修复方案 - 从运行库到项目配置全搞定
SQLite.Interop.DLL加载失败的终极解决方案:从运行环境到项目配置深度解析 当你正在开发一个依赖SQLite数据库的C#项目时,突然遇到"无法加载DLLSQLite.Interop.DLL"的错误提示,这绝对是一个令人头疼的问题。作为一名有多年.NET开发…...
别再只会抓HTTP了!手把手教你配置Fiddler抓取手机App的HTTPS请求(含证书安装避坑)
移动端HTTPS抓包实战:Fiddler配置与证书避坑指南 每次看到App里那些神秘的网络请求,你是不是也好奇它们到底在传输什么数据?作为开发者或测试人员,能够抓取和分析这些请求是基本功。但面对HTTPS加密流量,很多新手往往束…...
RK3576/RK3588 Yolo11 目标检测 Demo
前言 以前的大作业,根据rknn_model_zoo和easy eai示例代码修改(缝合),仅供参考 后来我试着模块化一些,方便看,但因为核心代码都是直接用的示例代码,所以有些模块还是耦合(composit…...
Excel双坐标折线图保姆级教程:用散点图搞定多组数据对比(附详细步骤图)
Excel双坐标折线图进阶指南:用散点图实现精准数据可视化 在数据分析的日常工作中,我们经常遇到需要同时展示两组量纲差异巨大的数据——比如销售额(百万级)和增长率(百分比)。传统的双坐标折线图虽然能解决…...
Docker 容器中文字体及 matplotlib 环境应用
为了避开 Noto CJK 这种复杂的 TTC(TrueType Collection)大包带来的识别问题,最理想的选择是使用独立打包的 OTF 或 TTF 字体。 0. 环境检查 # 1. 更新源并安装 fontconfig apt-get update apt-get install -y fontconfig# 2. 现在 fc-cache 命令可用了,刷新系统字体 fc-…...
效率飙升:用快马平台一键生成项目模板,告别重复的vscode环境配置
作为一个经常需要在新设备上配置开发环境的前端开发者,我深刻体会到重复搭建项目的痛苦。每次换电脑或者开新项目,都要从头安装VSCode插件、配置构建工具、集成UI库……这些琐碎工作至少会浪费半小时。最近发现InsCode(快马)平台能完美解决这个问题&…...
Dlib零基础避坑指南:Windows Python环境一键部署实战
Dlib零基础避坑指南:Windows Python环境一键部署实战 【免费下载链接】Dlib_Windows_Python3.x Dlib compiled binary (.whl) for Python 3.7-3.11 and Windows x64 项目地址: https://gitcode.com/gh_mirrors/dl/Dlib_Windows_Python3.x 副标题:…...
效率倍增:用快马生成jdk一键配置脚本与docker环境模板
效率倍增:用快马生成JDK一键配置脚本与Docker环境模板 每次新换电脑或者重装系统,最头疼的就是重新配置开发环境。特别是Java开发,光是下载JDK、配置环境变量就得折腾半天。最近发现用InsCode(快马)平台可以快速生成自动化脚本,把…...
Web AR技术深度探秘:7个创新案例重构浏览器增强现实体验
Web AR技术深度探秘:7个创新案例重构浏览器增强现实体验 【免费下载链接】AR.js Image tracking, Location Based AR, Marker tracking. All on the Web. 项目地址: https://gitcode.com/gh_mirrors/arj/AR.js 你是一个文章写手,你负责为开源项目…...
K230目标检测实战:手把手教你用Labelme标注数据并一键转成VOC格式(附避坑指南)
K230目标检测实战:高效数据标注与VOC格式转换全攻略 当你第一次接触K230开发板进行目标检测项目时,数据准备往往是最大的拦路虎。特别是从原始图片到符合AI_Cube要求的VOC格式数据集,这个过程充满了各种"坑"。本文将分享一套经过实…...
