【iOS】编译与链接

这篇具有很好参考价值的文章主要介绍了【iOS】编译与链接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

计算机语言分为机器语言、汇编语言和高级语言。

可以将高级语言分为两种:编译语言和解释型语言(直译式语言)。

解释型语言(逐步进行解释执行)

解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行,即解释一条代码,执行一条代码

优点:可移植好,因为只需要各种系统有解释器便可运行,不需要乱七八糟的系统库支持

缺点:执行速度慢,因为相比直接执行,多了一个翻译过程。

典型语言:php,javascript

编译型语言(一次性翻译)

编译型语言的程序只要经过编译器编译之后,每次运行程序都可以直接运行,不需要再次“翻译”。

优点:执行速度快

缺点:可移植性差,因为编译需要对操作系统的库做出链接,所以程序运行时需要用到特定的系统库

典型语言:objective-c,swift

编译链接过程

  1. 预处理:处理macro 宏(如#define), import 头文件替换及处理其他的预编译指令,产生.i文件。(都是以#号开头)
  2. 编译:把预处理完的一系列文件进行一系列词法、语法、语义分析,并且优化后生成相应的汇编代码,产生.s文件。
  3. 汇编:汇编器将汇编代码生成机器指令,输出目标文件,产生.o文件。(根据汇编指令和机器指令的对照表一一翻译就可以了)
  4. 链接:在一个文件中可能会到其他文件,因此,还需要将编译生成的目标文件和系统提供的文件组合到一起,这个过程就是链接。经过链接,最后生成可执行文件。

经过编译和链接,才会把写的代码转换成计算机能识别的二进制指令。

iOS编译是啥?

编译其实是一个用代码解释代码的过程。在 Objective-C 和 Swift 的编译过程中,用来解释代码的,使用的是Low Level Virtual Machine 的编译器开发工具套件(LLVM)。简单的说,LLVM 是一个项目,其作用就是提供一个广泛的工具,可以将任何高级语言的代码编译为任何架构的 CPU 都可以运行的机器代码。它将整个编译过程分类了三个模块:前端、公用优化器、后端。

  • 前端:对目标语言代码进行语法分析,语义分析,生成中间代码。在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行。我们在开发的过程中,其实 Xcode 也会使用前端工具对你的代码进行分析,并实时的检查出来某些错误。前端是针对特定语言的,如果需要一个新的语言被编译,只需要再写一个针对新语言的前端模块即可。
  • 公用优化器:将生成的中间文件进行优化,去除冗余代码,进行结构优化。
  • 后端:后段将优化后的中间代码再次转换,变成汇编语言,并再次进行优化,最后将各个文件代码转换为机器代码并链接。链接是指将不同代码文件编译后的不同机器代码文件合并成一个可执行文件。

clang 是 LLVM 的一个前端,它的作用是针对 C 语言家族的语言进行编译,像 c、c++、Objective-C。而 Swift 则自己实现了一个前端来进行 Swift 编译,优化器和后端依然是使用 LLVM 来完成。

Xcode 在编译 iOS 项目的时候,使用的正是 LLVM。其实我们在编写代码以及调试的时候,也在使用 LLVM 提供的功能,例如代码高亮(clang)、实时代码检查(clang)、代码提示(clang)、debug 断点调试(LLDB),这些都是 LLVM 前端提供的功能。而对于后端来说,我们接触到的就是关于 arm64、armv7、armv7s 这些 CPU 架构了。

我们的项目是一个 target,一个编译目标,它拥有自己的文件和编译规则,在我们的项目中可以存在多个子项目,这在编译的时候就导致了使用了 Cocoapods 或者拥有多个 target 的项目会先编译依赖库。

iOS编译干了啥?

  1. 写入辅助文件:将项目的文件结构对应表、将要执行的脚本、项目依赖库的文件结构对应表写成文件,方便后面使用;并且创建一个 .app 包,后面编译后的文件都会被放入包中。
  2. 运行预设脚本:Cocoapods 会预设一些脚本,当然你也可以自己预设一些脚本来运行。这些脚本都在 Build Phases 中可以看到。
  3. 编译文件:针对每一个文件进行编译,生成可执行文件 Mach-O,这过程涉及 LLVM 的完整流程,包括前端、优化器、后端。
  4. 链接文件:将项目中的多个可执行文件合并成一个文件。
  5. 拷贝资源文件:将项目中的资源文件拷贝到目标包。
  6. 编译 storyboard 文件:storyboard 文件也是会被编译的。
  7. 链接 storyboard 文件:将编译后的 storyboard 文件链接成一个文件。
  8. 编译 Asset 文件:我们的图片如果使用 Assets.xcassets 来管理图片,那么这些图片将会被编译成机器码,除了 icon 和 launchImage。
  9. 运行 Cocoapods 脚本:将在编译项目之前已经编译好的依赖库和相关资源拷贝到包中。
  10. 对包进行签名
  11. 完成打包

在上述流程中:2 - 9 步骤的数量和顺序并不固定,这个过程可以在Build Phases中指定。Phases:阶段、步骤,这个选项Tab在Xcode中的意思就是编译步骤。其实在Xcode中我们不仅可以设定整个编译步骤和顺序,还可以对编译规则(Build Rules)和具体步骤的参数(Build Settings)进行设定。

iOS整个编译链接过程

【iOS】编译与链接,ios,cocoa,macos

预处理(Prepressing)

处理macro 宏, import 头文件替换及处理其他的预编译指令,产生.i文件(都是以#号开头!)。规则如下:

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

编译(Compilation)

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

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

汇编(Assembly)

将main.s文件编译成main.o文件。(也就是我们常说的目标文件)

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

链接(Linking)

这个过程就是将main.o编译成对应的Mach-O文件,也就是我们常说的可执行文件。链接的本质就是把一个或多个目标文件和需要的库(静态库/动态库,如果需要的话)组合成一个文件(Mach-O可执行文件)。文章来源地址https://www.toymoban.com/news/detail-582039.html

到了这里,关于【iOS】编译与链接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • macOS Sonoma编译OpenCV源码输出IOS平台库

    1.macOS下载并编译OpenCV源码:  克隆源码: 主仓: git clone https://github.com/opencv/opencv.git 扩展仓:  git clone https://github.com/opencv/opencv_contrib.git    编译xcode源码需要CMake与XCode命令行工具 确认已安装CMake  确认已安装XCode  安装xcode command line tools 确认系统已安装python环境

    2024年02月10日
    浏览(47)
  • 如何建设一个用于编译 iOS App 的 macOS 云服务器集群?

    作者:京东零售 叶萌 现代软件开发一般会借助 CI/CD 来提升代码质量、加快发版速度、自动化重复的事情,iOS App 只能在 mac 机器上编译,CI/CD 工具因此需要有一个 macOS 云服务器集群来执行 iOS App 的编译。 今天就来谈谈如何建设 macOS 云服务器集群 最简单的方式就是购买一批

    2023年04月25日
    浏览(35)
  • 【iOS】动态链接器dyld

    参考:认识 dyld :动态链接器 dyld(Dynamic Linker)是 macOS 和 iOS 系统中的动态链接器,它是负责在运行时加载和链接动态共享库(dylib)或可执行文件的组件。在 macOS 系统中,dyld 位于 D/usr/lib/dyld 。 dyld源码地址 dyld 2(Dynamic Linker 2)是 macOS 和 iOS 系统中的第二代动态链接器。

    2024年02月16日
    浏览(29)
  • iOS/macOS - 逐行写入文件 (NSFileHandle)

    2024年02月15日
    浏览(34)
  • Charles证书过期解决方法macos/ios

    今天心血来潮打开Charles想试试看抓包手机APP(ios),结果发现各种x和提示ssl错误。开始以为是和魔法的代理冲突或者ip变了,捯饬很久后发现web的也报错。 然后搜了一会原因发现时证书过期了 1、搜索“钥匙串访问”,直接搜索“charles”,找到打叉的名称,直接删掉 2、打开

    2024年02月03日
    浏览(44)
  • iOS-配置Universal Links通用链接

    1、开启Associated Domains服务 登录苹果开发者网站,在 Certificates, Identifiers Profiles 页面左侧选择 Identifiers ,右侧选择对应的 App ID ,点击进入配置详情页,开启 Associated Domains 服务; 2、更新Profile文件(配置文件) 在 Certificates, Identifiers Profiles 页面左侧选择 Profiles ,右侧选择对

    2024年02月11日
    浏览(28)
  • Charles 链接安卓和ios手机操作

    重点:手机和电脑在同一个Wi-Fi网络!!! 一、、安卓手机 设置 - 无线和网络 - WLAN 长按当前 WiFi - 修改网络 勾选显示高级选项 代理 - 手动 服务器主机名 - 填写 Mac 的IP 地址,服务器端口 - 默认:8888 Mac电脑 IP 获取方法:Charles - Help - Local IP Address   2、下载证书 打开手机浏

    2024年02月08日
    浏览(49)
  • iOS通用链接(UniversalLink)配置详细流程

    登录苹果账号后,点击创建的APP 的Bundle ID,跳转到APP 信息页面。 记录下 Team ID  和 Bundle ID  备用。 勾选上 功能列表上的 ”Associated Domains“选项。 配置苹果后台 创建一个text空文本文件,去掉文件后缀,命名为 apple-app-site-association (不能修改,且不能添加后缀)。 文件内添加

    2024年02月13日
    浏览(28)
  • XCODE IOS 静态链接库替换升级

    XCODE 版本15.2.  一个很久需求没更新的IOS 应用,近来有新需求要开发。 拉下代码运行,出现了个BAD_ACCESS错误。出错的位置位于一个调用的第三方的.a静态库内部。因为调用代码并没有修改,很容易想到可能XCODE相关升级,导致的问题。 由于是第三方的一个.a静态库,兼容问题

    2024年02月02日
    浏览(39)
  • iOS textView支持超链接跳转

    将某些文字变成高量可以点击的超链接核心功能代码 同时,要实现点击超链接的UITextView代理方法 完整代码 实现代理方法 效果图

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包