>

1、澳门博发娱乐官网让静态库支持bitcode,已经有

- 编辑:澳门博发娱乐官网 -

1、澳门博发娱乐官网让静态库支持bitcode,已经有

"民之失德,乾糇以愆;他山之石,可以攻玉。" - 《诗经》

一、bitcode bundle could not be generated because ' XXXX' 错误

澳门博发娱乐官网 1

这类错误是由于静态库不支持bitcode而你自己的工程支持bitcode,解决方案有两种:

1、让静态库支持bitcode:Target -》 Build Settings -》Other C Flags 添加 -fembed-bitcode

澳门博发娱乐官网 2

注意:(更详细的可自行百度)

确保打包的时候使用的是fembed-bitcode, 而不是fembed-bitcode-maker 

fembed-bitcode-maker:只是简单的标记一下在archive出来的二进制中bitcdoe所在的位置。

fembed-bitcode: 真的会生成bitcode指令,并且嵌入到二进制中

2、自己的工程关闭bitcode:Target -》 Build Settings -》Enable Bitcode 设置为NO(xcode9 默认创建的工程Enable Bitcode为YES)

<p> 在ios开发中,我们经常会使用到第三方的一些静态库,导入第三方类库运行程序后你会发现,编译时可以正常编译但是运行时会app会闪退,报出selector not recognized的错误。一般的第三方库的开发文档中都会写出这种问题的解决方法,如在Other Linker Flags中加入-ObjC或者-all_load或者-force_load这样的解决方法。为什要这要做呢?报错为什么编译的时候有问题呢,首先我们先引入一个链接器的概念.</p>

链接器

So上的解释

澳门博发娱乐官网 3

二、调用framework中的方法或framework内部调用方法导致unrecognized selector sent to class XXXX 错误

此类问题多半是由于静态库添加了Category导致的,需要在自己的项目中配置,Target -》 Build Settings -》Other Linker Flags 添加-ObjC

-ObjC原文链接

解决这个错误的方法就是:将Category的方法链接到APP中,这样APP运行时,就能够找到对应的selector。而 –ObjC就可以完成这个任务。

 "-ObjC"的作用是:将静态库中任何Objective-C代码都链接到APP中。任何Objective-C代码当然也包括Category的方法。可以看出,使用-ObjC可能会链接很多静态库中未被使用的Objective-C代码,极大的增加APP的代码体积。

"-ObjC" 的兄弟

澳门博发娱乐官网 4

和 "-ObjC"作用类似的有以上的五种方案。可以看出,从增加APP代码体积来看,伪符号方案增加得最少"Perform Single-Object Prelink"、 "-force_load" 和 "–ObjC" 次之,"-all_load" 增加得最多。         在开发iOS SDK时,为了方便使用者手动集成,最好是减少使用者需要配置的信息,所以"伪符号"方案和 "Perform Single-Object Prelink"方案是推荐的。另外,第三方SDK常常是闭源的,对于使用者来说,伪符号是透明的,所以从简便性角度看,推荐"Perform Single-Object Prelink"方案。

遇到问题会持续补充...

<p>还记得我们在学习C程序的时候,从C代码到可执行文件经历的步骤是:</p>

从C代码到可执行文件经历的步骤是:

在开发 iOS 应用时,可能遇见这样的情况:你想实现的某种功能,已经有成熟的产品提供,可行的方案就是集成这个使用了很久,且有专业人员维护,最重要的是“免费”的产品。一番折腾之后,运行时有可能出现"selector not recognized"错误,最后发现是少了如下的配置(Build Settings -> "-ObjC"):

源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件

源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件

之所以使用该标志,和Objective-C的一个重要特性:类别有关。根据这里的解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,在编译到静态库时,这些代码模块实际上是存在不同的obj文件里的。程序在连接Category方法时,实际上只加载了Category模块,扩展的基类代码并没有被加载。这样,程序虽然可以编译通过,但是在运行时,因为找不到基类模块,就会出现 unrecognized selector 这样的错误。就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。

这个flag是专门处理-ObjC的一个bug的。在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。-force_load在xcode3.2后可用。但是-force_load后面必须跟一个指向静态库的路径,指定具体的文件。

澳门博发娱乐官网 5

在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件通过这个流程你也应该知道为什么在编译的过程中没事而在运行的时候就会报错了. 那我们为什么要设置Other Linker Flags呢 因为Other Linker Flags其实就是链接器工作时除了默认参数外的其他参数。

在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件

那么这个"–ObjC" 到底是个什么鬼? 我们来扒一扒。

苹果官方Q&A上有这么一段话:

通过这个流程你也应该知道为什么在编译的过程中没事而在运行的时候就会报错了. 那我们为什么要设置Other Linker Flags呢 因为Other Linker Flags其实就是链接器工作时除了默认参数外的其他参数。

本文由胜博发-编程发布,转载请注明来源:1、澳门博发娱乐官网让静态库支持bitcode,已经有