【iOS】—— 编译链接

news2024/11/26 12:30:14

【iOS】—— 编译链接

文章目录

  • 【iOS】—— 编译链接
  • 编译流程
    • 预处理(预编译Prepressing)
    • 编译(Compilation)
    • 汇编(Assembly)
    • 链接(Linking)

编译流程

编译流程分为四步

  • 预处理(Prepressing)
  • 编译(Compilation)
  • 汇编(Assembly)
  • 链接(Linking)

在这里插入图片描述

预处理(预编译Prepressing)

作为编译的第一步,首先将main.m文件编译成了main.i文件,指令如下:

clang -E main.m -o main.i

预处理的过程虽然是将main.m文件编译成了mian.i文件,但是实际上的过程并不是这么简单的,那么具体的预编译情况是什么样的呢:
预编译是要处理源代码中以#开头的所有预编译指令。规则如下:

  • #define 删除,并展开对应的宏定义。
  • 处理所有的条件预编译指令。如#if#ifdef#else#endif
  • #include#import 包含的文件递归插入到此处(含#处)。
  • 删除所有的注释 //、/**/等。
  • 添加行号和文件名标识。如 # 1 “main.m"(编译调试会用到)。

编译(Compilation)

main.i文件编译成main.s文件,指令如下:

clang -S main.i -o main.s

这个过程就是把上面的main.i文件进行:词法分析、语法分析、静态分析,优化生成相应的汇编代码,最终生成main.s文件。

这里我们需要了解一下这几个名词:

  • 词法分析:把源代码的字符序列分割成一个个token(关键字、表示符、字面量、特殊符号),比如把标识符放到符号表里面。
  • 语法分析: 生成抽象语法树AST,此时运算符号的优先级确定了;有些符号具有多重含义也确定了,比如:*是乘号还是对指针取内容;表达式不合法括号不匹配等等,都会报错。
  • 静态分析:分析类型声明匹配问题。比如整型和字符串相加,肯定会报错。
  • 中间语法生成: CodeGen根据AST(抽象语法树)自上向下逐步翻译成LLVM IR,并且对在编译期就可以确定的表达式进行优化,比如代码里面的a=1+3,可以优化成a=4。(假如开启了bitcode)
  • 目标代码生成与优化: 根据中间语法生成依赖具体机器的汇编语言;并优化汇编语言。这个过程中,假如有变量且定义在同一个编译单元里,那么就给这个变量分配空间,确定变量的地址。假如变量或者函数不定义在这个编译单元里面,那就等到链接的时候才能确定地址。

汇编(Assembly)

main.s文件编译成main.o文件(也就是我们常说的目标文件),指令如下:

clang -c main.s -o main.o

这个过程就是把上面得到的main.s文件里面的汇编指令翻译成机器指令,最终生成等到main.o

链接(Linking)

这个过程就是将main.o编译成对应的Mach-O文件,也就是我们常说的可执行文件,指令如下:

clang main.o -o main

链接的本质就是把一个或多个目标文件和需要的库(静态库/动态库,如果需要的话)组合成一个文件(Mach-O可执行文件)

在这里插入图片描述

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

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

相关文章

基于mediapipe的手势识别

安装opencv:pip install opencv-python 安装mediapipe:pip install mediapipe draw_utils.py: import cv2 import numpy as npdef draw_line(img, width, height, hand, start_index, stop_index):for i in range(start_index, stop_index):x1, y1 = int(hand.landma…

Unity 多相机 同屏显示

一 首先了解: 相机和Canvas 的渲染先后关系 什么是相机的渲染顺序? 答:简单理解就是 用毛刷 刷墙面,先刷的,会被后刷的 挡住 。 列如:相机01: 先渲染的大海,相机02:后…

爬虫之Scrapy

一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域&#x…

jquery实现甘特图时效管理

一、效果图 二、html文件 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html lang"en"><head><script src"../../../baoBiaoHtml/js/jquery-1.9.0.js"></script><script src"../..…

【GitOps系列】自动化构建Image

文章目录 使用 GitHub Action 构建镜像使用 GitLab CI 构建镜像使用 Tekton 构建镜像Tekton组件安装Tekton 简介创建 Tekton Pipeline创建 Task创建 Pipeline创建 EventListener创建 TriggerTemplate创建 Service Account 和 PVC设置 Secret 创建 GitHub Webhook触发 Pipeline …

markdown2html 转化流程

定义一个extensions function markedMention() {return {extensions: [{name: mention,level: inline,start(src) {// console.log("markedMention start....", src);return src.indexOf(#)},tokenizer(src, tokens) {const rule /^(#[a-zA-Z0-9])\s?/const match…

巴斯夫与长三角物理研究中心开展合作,专注固态和钠离子电池领域

“巴斯夫&#xff0c;全球知名化学公司&#xff0c;宣布与长三角物理研究中心合作&#xff0c;在江苏溧阳市成立联合研究中心&#xff0c;专注于固态电池和钠离子电池的科研。” 根据巴斯夫官方微博消息&#xff0c;新成立的研究中心名为“巴斯夫–长三角物理研究中心新能源汽车…

RAID6故障导致分区打不开的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台infortrend存储&#xff0c;有一组由12块硬盘组建的RAID6&#xff0c;RAID6的所有空间划分给一个LUN并映射到WINDOWS系统上&#xff0c;WINDOWS系统上划分了一个GPT分区。 服务器故障&分析&#xff1a; 存储无法访问&#xff0c;经过检…

TIOBE统计数据

TIOBE统计数据&#xff08;2023年7月&#xff09; TIOBE Index编程社区指数是编程语言流行度的一个指标。评级基于全球熟练工程师的数量、课程和第三方供应商的数量。Google、Bing、Yahoo!、维基百科、亚马逊、YouTube 和百度等流行搜索引擎用于计算评级。 七月头条&#xff1…

【C语言提升】深入了解动态内存管理

目录 一、静态分配和动态分配 二、内存管理函数 1、malloc 申请堆区空间 2、calloc 申请堆区空间 3、free回收堆区空间权限 4、memset内存设置函数 5、realloc内存增减函数 三、内存泄漏&#xff08;了解&#xff09; 一、静态分配和动态分配 1、静态分配 在程序编译…

【Python】类型注解 ② ( 基础变量设置类型注解 | 类对象设置类型注解 | 容器变量设置简易类型注解 | 容器变量设置详细类型注解 )

文章目录 一、为变量设置类型类型注解1、变量设置 " 类型注解 " 语法2、为 基础类型变量 设置 " 类型注解 "3、为 类 的 对象类型 设置 " 类型注解 "4、为 基础容器类型变量 设置 简易 " 类型注解 "5、为 基础容器类型变量 设置 详细 …

gma 2 教程(二)数据操作:3. 支持生成的栅格格式信息

为了方便了解和选择输出栅格格式、配置高级创建选项&#xff0c;下表列出了gma可以生成&#xff08;复制/创建/转换&#xff09;的所有栅格格式的主要信息&#xff1a; 格式名生成模式支持数据类型扩展名多维栅格支持色彩映射表支持的数据类型多波段支持压缩模式AAIGrid复制By…

Redis学习(三)分布式缓存、多级缓存、Redis实战经验、Redis底层原理

文章目录 分布式缓存Redis持久化RDB持久化AOF持久化 Redis主从Redis数据同步原理全量同步增量同步 Redis哨兵哨兵的作用和原理sentinel&#xff08;哨兵&#xff09;的三个作用是什么&#xff1f;sentinel如何判断一个Redis实例是否健康&#xff1f;master出现故障后&#xff0…

Java-API简析_java.lang.ProcessBuilder类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131729933 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

echarts_柱状图+漏斗图

目录 柱状图(bar)需求[1] 复制案例[2] 修改类目轴方向[3] 修改数据渲染方向[4] 修改坐标轴文本样式 漏斗图(funnel)漏斗图的形状 柱状图(bar) 需求 如上图&#xff0c;做一个横向柱状图&#xff0c;后端返回的数据是从小向大排列的数据&#xff0c;希望能够按照顺序进行展示。…

pnpm安装方式

pnpm安装方式 要使用pnpm进行安装&#xff0c;首先需要确保已经安装了Node.js。然后&#xff0c;按照以下步骤进行pnpm的安装&#xff1a; 打开终端或命令提示符。 在命令行中输入以下命令来全局安装pnpm&#xff1a; npm install -g pnpm这将使用npm将pnpm包全局安装到您的…

WireShark

文章目录 IP协议部分协议对应协议号路由器IP分片IP分片的缺点 TCP协议[TCP MSS](https://blog.csdn.net/meihualing/article/details/113739693) UDP协议ARP ICMPDHCPDNSFTP wireshark可以学习网络协议&#xff0c;解决一些问题 IP协议 IP指网际互连协议&#xff0c;Internet P…

动态规划01背包之1049 最后一块石头的重量 II(第9道)

题目&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 。那么粉碎的可能结果如下&#xff1a; …

Verilog 学习之路

循环 7-10 代码段 generategenvar i;for (i0; i<8; i i1) begin: my_block_nameassign out[i] in[8-i-1];end endgenerate解释 该代码使用了 S y s t e m V e r i l o g SystemVerilog SystemVerilog 中的 g e n e r a t e generate generate 构造&#xff0c;它允许在…

【Docker】快速入门,带你快速了解 Docker

文章底部有投票活动&#xff0c;赶快参与进来吧&#x1f603; 相信大家在开发过程中都听说过 Docker 一词&#xff0c;至于 Docker 在开发中扮演的角色&#xff0c;估计好多人都说不上来&#xff0c;今天就让阿Q带大家一起揭开它神秘的面纱&#xff01; 文章目录 什么是容器&a…