如何理解链接(Linking)这一编译过程中的步骤

在理解链接(Linking)这一编译过程中的步骤之前,有必要了解编译器的整体工作流程。编译器通常经历以下几个阶段:

  1. 预处理(Preprocessing):处理源代码文件中的预处理指令,如 #include 指令,它们通常涉及插入头文件的内容。

  2. 编译(Compilation):将预处理后的源代码转换为汇编代码,然后进一步转换为机器码,生成对象文件(.o.obj 文件)。

  3. 链接(Linking):最后一步是链接,这一步将编译生成的一个或多个对象文件与库文件合并,生成可执行文件。

静态链接(Static Linking)

  • 定义:静态链接是在链接阶段将所有必需的库函数的代码直接拷贝到最终的可执行文件中。这意味着程序在运行时不需要外部的库文件,因为所有必需的代码都已经包含在内。

  • 文件类型:在 Unix/Linux 系统上,静态库通常有 .a (Archive)后缀;在 Windows 系统上,通常是 .lib

  • 优缺点:静态链接的可执行文件通常较大,因为包含了所有必需的库代码,但它们不依赖于外部库文件,可以在没有这些库文件的系统上运行。

动态链接(Dynamic Linking)

  • 定义:动态链接不是将库函数的代码拷贝到可执行文件中,而是在程序运行时从共享库(动态链接库)中加载所需的函数。这意味着可执行文件在运行时依赖于外部的库文件。

  • 文件类型:在 Unix/Linux 系统上,动态库文件通常有 .so (Shared Object)后缀;在 Windows 上,它们是 .dll (Dynamic Link Library)文件。

  • 优缺点:动态链接的可执行文件通常较小,因为它们不包含整个库的代码。动态链接还允许多个程序共享内存中同一份库代码,节省空间。但这也意味着运行程序时必须确保相应的库文件可用和兼容。

通过 make 实现编译和链接

在使用 make 管理构建过程时,Makefile 文件中会指定如何编译源代码并将其链接成最终的可执行文件。例如:

all: programprogram: main.o libmath.agcc -o program main.o -L. -lmathmain.o: main.cgcc -c main.clibmath.a: math.oar rcs libmath.a math.omath.o: math.cgcc -c math.c

在上面的 Makefile 中,main.o 是主程序的编译产物,libmath.a 是一个静态库文件。链接步骤中,gcc 编译器用 -L 指定库文件路径,用 -l 指定要链接的库。这个例子展示了静态链接的过程。对于动态链接,过程类似,但涉及的是 .so.dll 文件而非 .a.lib 文件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis概览

Redis存储是Key-Value结构的数据,其中Key是字符串类型,Value有5种常见的数据类型 字符串 String 哈希 hash 列表 list 集合 set 有序集合 sorted set / zset 各种数据类型的特性 字符串操作命令 : ● SET ke…

v8 pwn利用合集

文章目录 前置知识JS Object 相关Ignition 相关JIT - turboFan 相关starCTF2019 OOB【越界读写map字段】googleCTF2018 jit【浮点数精度丢失导致越界读写】数字经济线下 Browser【Object::toNumber中callback导致的越界写】前置知识 JS Object 相关 V8 中的对象表示 ==> 基…

LeetCode 2125. 银行中的激光束数量【数组,遍历】1280

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

深入理解 Vue.js 中的 `h` 函数:虚拟 DOM 创建指南

Vue.js 是一个用于构建用户界面和单页应用程序的渐进式 JavaScript 框架。它的核心概念之一是虚拟 DOM,这是实际 DOM 的轻量级副本,Vue 使用它来优化对网页的更新。为了操作虚拟 DOM,Vue 提供了一个通常被称为 h 函数的方法。这个函数对于理解…

大模型查询工具助手之股票免费查询接口

新浪股票免费查询接口 股票研究的实践中需要查询股票市场接口,百度搜索大多链接都要收费或者注册。 记得新浪股票以前是免费查询,但现在遇到了小问题。 决策引擎专栏: Falcon构建轻量级的REST API服务 决策引擎-利用Drools实现简单防火墙策…

vue 用 h() 函数创建 Vnodes

目录 前言一、h() 函数的基本使用方式二、h() 函数的进阶使用方式1、条件渲染2、列表渲染3、事件4、使用插槽 前言 Vue 提供了一个 h() 函数用于创建 vnodes。 h() 是 hyperscript 的简称——意思是“能生成 HTML (超文本标记语言) 的 JavaScript”。 const vnode h(div, /…

技术学习周刊第 1 期

2018 年参与过 1 年的 ARTS 打卡,也因为打卡有幸加入了 MegaEase 能与皓哥(左耳朵耗子)共事。时过境迁,皓哥已经不在了,自己的学习梳理习惯也荒废了一段时间。 2024 年没给自己定具体的目标,只要求自己好好…

电话号码信息收集工具:PhoneInfoga | 开源日报 No.137

sundowndev/phoneinfoga Stars: 11.2k License: GPL-3.0 PhoneInfoga 是一个用于扫描国际电话号码的信息收集框架,它允许用户首先收集基本信息 (如国家、地区、运营商和线路类型),然后使用各种技术来尝试找到 VoIP 提供商或识别所有者。该工具与一系列必…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-7二阶系统

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-7二阶系统 1. 二阶系统对初始条件的动态响应 Matlab/Simulink - 2nd Order Syetem Response to IC2. 二阶系统的单位阶跃响应 2nd Order System Unit Step Response3. 二…

copilot在pycharm的应用

Copilot在PyCharm中的应用 一、引言 随着人工智能技术的飞速发展,AI在编程领域的应用也越来越广泛。Copilot,作为一款由微软开发的AI编程助手,已经引起了广大开发者的关注。它利用深度学习技术,通过分析大量开源代码&#xff0c…

Linux-v4l2框架

框架图 从上图不难看出,v4l2_device作为顶层管理者,一方面通过嵌入到一个video_device中,暴露video设备节点给用户空间进行控制;另一方面,video_device内部会创建一个media_entity作为在media controller中的抽象体&a…

unity中0GC优化方案《zstring》

文章目录 序言简介GC带来的问题性能瓶颈玩家体验受损 使用方式 序言 游戏开发秉承遇到好东西要分享,下面介绍zstring,感谢作者开源无私奉献 源码地址:https://github.com/871041532/zstring 简介 GC带来的问题 性能瓶颈 GC暂停主线程执行…

LaTeX中常用的字母及符号

收集 LaTeX 中常用的字母、符号。 字体字形设置 命令实例说明\fbox LaTeX \fbox{LaTeX} LaTeX​加边框\boxed L a T e X \boxed{LaTeX} LaTeX​斜体加边框\mathbf L a T e X \mathbf{LaTeX} LaTeX加粗\boldsymbol L a T e X \boldsymbol{LaTeX} LaTeX斜体加粗 希腊字母 符号…

docker 安装elasticsearch、kibana、cerebro

安装步骤 第一步安装 docker 第二步 拉取elasticsearch、kibana、cerebro 镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.2 docker pull docker.elastic.co/kibana/kibana:7.10.2 docker pull lmenezes/cerebro:latest第三步、创建 容器 创建e…

设计模式之中介者模式【行为型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

[Kafka集群] 配置支持Brokers内部SSL认证\外部客户端支持SASL_SSL认证并集成spring-cloud-starter-bus-kafka

目录 Kafka 集群配置 准备 配置流程 Jaas(Java Authentication and Authorization Service )文件 zookeeper 配置文件 SSL自签名 启动zookeeper集群 启动kafka集群 spring-cloud-starter-bus-kafka 集成 Kafka 集群配置 准备 下载统一版本Kafka服务包至三台不同的服…

vue判断组件有没有传入的slot有就渲染slot没有就渲染内部节点

GPT4国内站点:海鲸AI 在 Vue 中,你可以使用 $slots 对象来检查是否有特定的插槽内容被传递给组件。Vue 3 中的 $slots 是一个对象,其中包含了所有插槽的引用。如果插槽没有内容,对应的插槽属性将会是 undefined。 下面是一个例子…

安卓Android Studio读写FM1208CPU卡源码

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21818769070.11.6c46789elLwMzv&id615391857885 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout x…

安卓之图形绘制的应用场景以及各种技术优劣分析

一、文章摘要 安卓系统作为全球最流行的移动操作系统之一&#xff0c;其图形绘制功能在各种应用场景中发挥着重要作用。无论是创意绘图、教育应用、游戏开发还是虚拟现实&#xff0c;图形绘制都是关键的一环。本文将深入探讨安卓图形绘制的应用场景&#xff0c;并分析各种技术的…

Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中

场景 SpringBootVue整合WebSocket实现前后端消息推送&#xff1a; SpringBootVue整合WebSocket实现前后端消息推送_websocket vue3.0 springboot 往客户端推送-CSDN博客 上面实现ws推送数据流程后&#xff0c;需要在windows上使用ws客户端定时记录收到的数据到文件中&#x…