当前位置: 首页 > 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;将所有业务数据…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...