问题:当更新最新的第三方库后,archive的时候会报这样的错误

Invalid bitcode version (Producer: '802.0.41.0_0' Reader: '800.0.42.1_0')

看到这样的错误很头疼,此时有两种方法解决,如下:

方法一:

简单粗暴的方法,使用老版本的SDK,指定SDK的版本,这样可以解决!

方法二:

在Bulid Settings -> Build Options -> Enable Bitcode 改为NO,那么问题来了,Bitcode是什么玩意,老子没见过,不用着急,下面给你介绍Bitcode的作用!

Bitcode:

做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而编译失败的的项目都有一个共同点,就是链接了第三方二进制的库或者框架,而这些框架或者库恰好没有包含bitcode的东西(暂且称为东西),从而导致项目编译不成功.所以每当遇到这个情况时候大部分人都是直接设置Xcode关闭bitcode功能,全部不生成bitcode.也不去深究这一开关背后隐藏的原理.中枪的请点个赞.LLVM是目前苹果采用的编译器工具链,Bitcode是LLVM编译器的中间代码的一种编码,LLVM的前端可以理解为C/C++/OC/Swift等编程语言,LLVM的后端可以理解为各个芯片平台上的汇编指令或者可执行机器指令数据,那么,BitCode就是位于这两者直接的中间码. LLVM的编译工作原理是前端负责把项目程序源代码翻译成Bitcode中间码,然后再根据不同目标机器芯片平台转换为相应的汇编指令以及翻译为机器码.这样设计就可以让LLVM成为了一个编译器架构,可以轻而易举的在LLVM架构之上发明新的语言(前端),以及在LLVM架构下面支持新的CPU(后端)指令输出,虽然Bitcode仅仅只是一个中间码不能在任何平台上运行,但是它可以转化为任何被支持的CPU架构,包括现在还没被发明的CPU架构,也就是说现在打开Bitcode功能提交一个App到应用商店,以后如果苹果新出了一款手机并CPU也是全新设计的,在苹果后台服务器一样可以从这个App的Bitcode开始编译转化为新CPU上的可执行程序,可供新手机用户下载运行这个App.回顾一下之前的苹果手机,在iPhone出来之前,苹果主要的编译器技术是用经过稍微改进的GCC工具链来把Objective-C语言编写的代码编译出所指定的机器处理器上原生的可执行程序.编译器产生的可执行程序叫做"Fat Binaries"--类似于Windows下PE格式的exe和Linux下的ELF格式的二进制,不同的是,一个"Fat Binary"可以包含同一个程序的很多版本,所以同一个可执行文件可以在不同的处理器上运行.主要就是这个技术让苹果的硬件很容易的从PowerPC迁移到PowerPC64的处理器,以及后来再迁移到Intel和Intel64处理器.这个方案带来的负面影响就是同一个文件中存了多份可执行代码,除了当前机器可执行的那一份之外其他都是无用的,白占空间. 这个在市场上被称为"Universal Binary",在苹果从PowerPC迁移到Intel处理器的事情开始存在的(一个二进制文件既包含一份PowerPC版本和一份Intel版本).慢慢的后来又支持同时包含Intel 32bit和Intel 64bit. 在一个Fat binary中,又操作系统运行时根据处理器类型动态选择正确的二进制版本来运行,但是应用程序要支持不同平台的处理器的话,应用程序本身要多占用一些空间.当然也有一些瘦身的工具,比如lipo,可以用来移除fat binary中那些当前机器中不被支持的或者多余的可执行代码达到瘦身目的,lipo不会改变程序执行逻辑,仅仅只是文件的大小瘦身.编译器现状随着移动设备移动互联网的深入发展,现在移动设备中的程序大小变得越来越重要了,主要是因为移动设备中不会有电脑上那么大的一个硬盘驱动器.还有就是苹果早就从原始的ARM处理器迁移到自家设计的A4,A5,A5X,A6,A7,A8,A8X,A9,A9X以及后续的A10处理器,他们的指令集已经发生了改变和原始ARM设计的有所区别,所有的这些变化都被iOS操作系统底层以及Xcode/LLVM编译工具向上层程序员一定程度的透明了,编译出来的程序会包含很多执行代码版本.当面对这个问题后,苹果投入大量成本迁移到LLVM编译器架构并使用bitcode的必要性越来越大.从最开始的把OPENGL编译为特定的GPU指令到把Clang编译器(LLCM的C/OC编译前端)支持Objective-C的改进并作为Xcode的默认编译器.LLVM提供了一个虚拟指令集机制,它可以翻译出指定的所支持的处理器架构的执行代码(机器码).这个就使得为iOS应用程序的编译开发一个完全基于LLVM架构的工具链成为可能.而LLVM的这个虚拟的通用的指令集可以用很多种表示格式:

  • 叫做IR的文本表示的汇编格式(像汇编语言);
  • 转换为二进制数据表示的格式(像目标代码),这个二进制格式就是我们所说的bitcode.

Bitcode和传统的可执行指令集不同,他维护的是函数功能的类型和签名,比如,传统可执行指令集中,一系列(<=8)的布尔值可以压缩存储到单个字节中,但是在bitcode中他们是各自独自表示的.此外,逻辑运算操作(比如寄存器清零操作)也由他们对应的逻辑表示方法($R=0);当这些BitCode要转换为特定机器平台的指令集时,他可以用经过针对特定机器平台优化过的汇编指令来代替:xor eax, eax.(这个汇编指令同样是寄存器<eax>清零操作).

然而bitcode他也不是完全独立于处理器平台和调用约定的.寄存器的大小在指令集中是一个相当重要的特性,众所周知,64bit寄存器可以比32bit寄存器存储更多的数据,生成64bit平台的bitcode和32bit平台的bitcode是明显不同的,还有,调用约定可以根据函数定义或者函数调用来定义,这些可以确定函数的参数传递是传寄存器值呢还是压栈. 一些编程语言还有一些像sizeof(long)这样的预处理指令,这些将在bitcode生成之前前被翻译.一般情况下,对于支持fastcc(fast calling convention)调用的64bit平台会生成与其一致的bitcode代码.

苹果的要求:

到此,让我们思考一下,为什么苹果默认要求watchOS和tvOS的App要上传bitcode? 因为把bitcode上传到他自己的中心服务器后,他可以为目标安装App的设备进行优化二进制,减小安装包的下载大小,当然iOS开发者也可以上传多个版本而不是打包到单个包里,但是这样会占用更多的存储空间. 最重要的是允许苹果可以在后台服务器对应用程序进行签名,而不用导出任何密钥到终端开发者那.

上传到服务器的bitcode给苹果带来更好处是: 以后新设计了新指令集的新CPU,可以继续从这份bitcode开始编译出新CPU上执行的可执行文件,以供用户下载安装.
但是bitcode给开发者带来的不便之处就是: 没用bitcode之前,当应用程序奔溃后,开发者可以根据获取的的奔溃日志再配上上传到苹果服务器的二进制文件的调试符号表信息可以还原程序运行过程到奔溃时后调用栈信息,对问题进行定位排查.但是用了bitcode之后,用户安装的二进制不是开发者这边生成的,而是苹果服务器经过优化后生成的,其对应的调试符号信息丢失了,也就无法进行前面说的还原奔溃现场找原因了.

目前,watchOS和tvOS应用发布必须上传带bitcode版本的包.iOS应用发布对bitcode的要求是可选的,用户可以在Xcode的项目设置中关闭. 相当于在编译的时候加一个标记:embed-bitcode-marker(调试构建) embed-bitcode(打包/真机构建).这个在clang编译器的参数是-fembed-bitcode,swift编译器的参数是-embed-bitcode.

如果转载请注明转于: AirZilong的博客

Swift Invalid bitcode version (Producer: '802.0.41.0_0' Reader: '800.0.42.1_0')相关推荐

  1. windows 下配置 apache 2.2.4+php 5.2.5+mysql 5.0.41+zend 3.3.0最新配置

    windows 下配置 apache 2.2.4+php 5.2.5+mysql 5.0.41+zend 3.3.0最新配置 1,php5.2.5 for windows 2, mysql-5.0.4 ...

  2. 构建Polygon多边形的时候提示 -- Invalid number of points in LinearRing (found 3 - must be 0 or = 4)

    最近在项目中由于导入的OSM(OpenStreetMap)数据量太大,暴露了一个先前就藏匿着的bug,只不过,随着数据量的增加,实例越来越多,测试就更加逼近实战,于是,这个bug终于爆炸了,只见控制台 ...

  3. No cached version of com.android.tools.build:gradle:2.0.0 available for offline mode.

    异常场景 从AS2.0升级到2.1,重新编译工程后,抛出了如下异常 Error:A problem occurred configuring root project 'AndroidStudioPr ...

  4. (R)?ex 0.41.2 发布,软件配置和部署

    (R)?ex 0.41.2 修复了模板处理引擎和 CLI 参数解析的 bug . 使用 (R)?ex 你可以从一个中心点通过完整的配置管理和软件发布流程来管理所有的机器 (R)?ex 使用 SSH 作 ...

  5. Module build failed: Error: Node Sass version 5.0.0 is incompatible with ^4.0.0.

    Module build failed: Error: Node Sass version 5.0.0 is incompatible with ^4.0.0. node-sass版本过高导致的,卸载 ...

  6. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨0.41%

    陀螺财经消息,据tokeninsight.com数据显示,反映区块链行业整体表现的TI指数北京时间03月11日8时报4011.73点,较昨日同期上涨16.4点,涨幅为0.41%.此外,在TokenIn ...

  7. Node Sass version 6.0.0 is incompatible with ^4.0.0.

    你看到这里了? node-sass已经弃用了,现在它已经被dart-sass所替代,dart-sass的安装更加稳定,去试试它吧. 项目场景: 使用scss文件配置Vue页面控件的样式. 问题描述: ...

  8. 微信3.1.0.41逆向-微信3.1.0.41HOOK接口(WeChatHelper3.1.0.41.dll)使用说明

    为了节省微信HOOK开发时间,现将微信HOOK注入DLL接口给大家,本接口从3.0.0.47版本开始,最新版本3.1.0.41,后续会根据自己的时间升级,本接口用vc++2017编写,Win32编译, ...

  9. check the manual that corresponds to your MySQL server version for the right syntax to use near (0)

    问题 在使用Navicat从mysql数据库导出sql后,在其他数据库中执行该sql语句时,报了以下错误 > 1064 - You have an error in your SQL synta ...

最新文章

  1. python 怎样让 print 打印的结果不换行
  2. mycat是什么_MYCAT学习2
  3. 【MM模块】 Blanket PO 框架订单
  4. Python中定义函数的三种形式
  5. 深圳SQL数据库823报错修复
  6. SQL(一)- 数据库介绍与基础操作
  7. 红橙Darren视频笔记setContentView源码分析 xml加载的过程
  8. dax powerbi 生成表函数_如何用Power BI对数据建模?
  9. SQL函数字符串分拆
  10. 正则表达式:模式修饰符(自用)
  11. 阿里云Web播放器使用
  12. cap流程图_冲压工艺流程图+PFMEA+CP范例(中英文)
  13. 16本版式设计书籍推荐(附PDF链接)设计从业人员必备
  14. 算法注册机编写扫盲---第五课
  15. 龙芯3U板卡学习资料第706篇: GEC-2K1000 龙芯3U板卡
  16. 【C语言】第五章 - 操作符
  17. 大数据就业前景怎么样?
  18. 记录:win10 cmd切换目录 切换到D盘
  19. cmd 命令行安装包时 报4048错误
  20. RationalDMIS 7.1 状态区-测量设置

热门文章

  1. java并发编程实战wwj----------第二阶段-------------Worker-Thread-----------------36-37
  2. linux c/c 开发工具,Linux下的 C/C++ 开发与调试工具
  3. Vue+element-ui上传logo图片到后端生成二维码展示到页面
  4. linux缓存无法写入,Linux下搭建网站提示缓存文件写入失败怎么办?
  5. Word输出PDF公式丢失(特别是mathtype输出的)一步解决
  6. 天舟四号成功对接天和核心舱后向端口,北航人又立功了
  7. 安装包免费下载(持续更新ing…)
  8. 【ffprobe】查看TS : 视频和音频的pts、dts;查看文件的音频包/视频包总数
  9. 基于RS422通信的FPGA软件设计第四天
  10. 计算机win7知识,直观:计算机win7双显示器的设置方法_计算机的基本知识_IT /计算机_信息...