ca88官方会员登录深切明iOS开发被之BitCode功能。关于苹果Xcode编译器与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.

前言

召开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不见面改变程序执行逻辑,仅仅只是文件之大小瘦身.

史回顾

每当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代码.

编译器现状

乘势活动装备移动互联网的递进发展,现在走设备遭遇的次序大小变换得越来越重要了,主要是以移动设备受到未会见发出电脑及那稀的一个硬盘驱动器.还有即使是苹果已经从老之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.

苹果的要求

交者,让我们思考一下,为什么苹果默认要求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.

履有真正懂

我们还是应当实际为两只测试代码进行实施及查看一下较好.做少赖测试,第一赖准备一定量单C语言源代码继续测试;第二潮将里面一个变通也汇编语言源代码后再一个C代码和一个汇编代码一起还之前的测试步骤进行对比校验差异.

  • 1 . 如下两只全凡Objective-C代码:

test.m :

#import <Foundation/Foundation.h>
void greeting(void)
{
    NSLog(@"hello world!");
}

demo.m :

#import <Foundation/Foundation.h>
void demo(void)
{
    NSLog(@"demo func");
}

据此Clang编译成 ARM64 格式且带bitcode的靶子文件test.o demo.o:

wuqiong:~ apple$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.m

下一场把少只目标文件包为一个静态库文件:

wuqiong:~ apple$ xcrun -sdk iphoneos ar  -r libTest.a test.o demo.o
ar: creating archive libTest.a

就此Shell命令otool查看目标文件中是否包含bitcode段:

wuqiong:~ apple$ otool -l test.o |grep bitcode
  sectname __bitcode
  sectname __bitcode

若见到输出了2行sectname __bitcode,就是认证及时静态库中的点滴独对象文件包含了bitcode.

  • 2.下将其中一个demo.m换成汇编语言再与编译:

用底的一声令下将demo.m的C代码转换为ARM64聚集编语言格式demo.s:

wuqiong:~ apple$ xcrun -sdk iphoneos clang -arch arm64 -S demo.m
wuqiong:~ apple$ cat demo.s
    .section    __TEXT,__text,regular,pure_instructions
    .ios_version_min 9, 2
    .globl  _demo
    .align  2
_demo:                                  ; @demo
    .cfi_startproc
; BB#0:
    stp x29, x30, [sp, #-16]!
    mov  x29, sp
Ltmp0:
    .cfi_def_cfa w29, 16
Ltmp1:
    .cfi_offset w30, -8
Ltmp2:
    .cfi_offset w29, -16
    adrp    x0, L__unnamed_cfstring_@PAGE
    add x0, x0, L__unnamed_cfstring_@PAGEOFF
    bl  _NSLog
    ldp x29, x30, [sp], #16
    ret
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ; @.str
    .asciz  "demo func"

    .section    __DATA,__cfstring
    .align  4                       ; @_unnamed_cfstring_
L__unnamed_cfstring_:
    .quad   ___CFConstantStringClassReference
    .long   1992                    ; 0x7c8
    .space  4
    .quad   L_.str
    .quad   9                       ; 0x9

    .section    __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
    .long   0
    .long   0


.subsections_via_symbol

下一场去demo.m这个C源代码,仅留下test.mdemo.s:

wuqiong:~ apple$ rm demo.m

今日,我们来将test.m此C源代码和dmeo.s斯集编源代码来一头带在-fembed-bitcode参数来蛮成靶子代码并打包为一个静态库:

wuqiong:~ apple$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.s
wuqiong:~ apple$ xcrun -sdk iphoneos ar -r libTest.a test.o demo.o

接下来我们重新运行otool工具来检查这个新的静态库中含有的2只目标文件是否还带有bitcode段:

wuqiong:~ apple$ ar -t libTest.a
__.SYMDEF SORTED
test.o
demo.o
wuqiong:~ apple$ otool -l libTest.a | grep bitcode
  sectname __bitcode

酷想得到,这无异于差,只生一行sectname __bitcode出口,这就是说明及时简单独对象文件,有一个请勿带有bitcode段,哪怕我们在编译的时候指定了参数-fembed-bitcode否从没用.至于具体是呀一个未带bitcode段,我们自然知道即便是生由ARM64聚众编语言编译过来的对象文件未带.

那么即使查获一个结论,bitcode的变,是由汇编语言以上的上层语言编译而来,和极其前面所说的那样,他是上层语言及汇编语言(机器语言)之间的一个中档码.

现阶段咱们通常的iOS应用开发被,一般不见面要用到汇编层面去优化的代码.所以我们重点关心第三方(开源)C代码,尤其是音视频编码解码这些计算密集型项目代码,关键计算的代码针对一定平台还来针对性许平台的汇编版本实现,当然也发出C的实现,但是默认编译一般还是故的汇编版本,这样就会见导致我们当编译这个开源代码的时节便你带来了-fembed-bitcode参数为仅仅只是让色面临的部分C代码的目标文件带了bitcode段,而那小数的汇编代码的目标文件一律未带bitcode段,这样编译出这个库房交给上层开发者使用的时节,就见面现出于包上传或者真机调试的时刻坐Xcode默认开了bitcode功能一旦链接失败,导致不能够真机调试要不能够上传应用至AppStore.

实施来真正懂

咱俩要当实际为两独测试代码进行实施及查看一下于好.做片坏测试,第一差准备简单单C语言源代码继续测试;第二次将里面一个浮动为集编语言源代码后再也一个C代码和一个汇编代码一起又之前的测试步骤进行对比校验差异.

此文之初衷

最近以辅导自己戴维营战友们举行手机音视频直播的App,调试之时节手机采集音视频,视频用h264编码,音频采用aac编码,通过RTMP商量为斗鱼直播频道发布媒体流,项目需要因此FFMPEGlibx264个别单开源项目,在编译为iOS框架库提供于学员因此底时候,他们撞了bitcode的题材,虽然足采用直接关闭bitcode来避免不当,但是战友的求知欲要满足,格物致知,必须于其知其究竟.

libx264是VideoLan基金会管理之一个视频编解码的开源项目,其大气采取了逐条平台的多媒体汇编指令进行了优化,在编译为非带bitcode的库底时节,完全本官方autotools编译方法是未曾其余问题之;编译全带bitcode的堆栈底早晚我们只能关闭汇编优化,在实践./configure品可以长--disable-asm参数来经受用汇编.但是,这个选项在configure剧本中之落实机制来问题.导致其依然调用了汇编的函数,但是汇编的代码却没有编译进去,从而会造成项目也真机构建以及打包的链接阶段会暴露找不顶号的荒谬,这样即便非能够一气呵成少咸其美.出于轻微程度之强迫症影响,故将前面的FFMPEGlibx264列之编译脚本进行了改善和打补丁.时早就好做到一键编译出带全部bitcode的FFMPEG和libx264的框架了.

FFmpeg需依靠libx264.

机动编译脚本项目位置放在github:
https://github.com/Diveinedu-CN/FFmpeg-iOS-build-script.git

由时间跟字数由,关于其他更多详细的音就非细道来了.

戴维营教育Slogan: Dive in education!

再次多iOS开发精品文章:戴维营技术博客

1 . 如下两只整凡Objective-C代码:

test.m :

#import <Foundation/Foundation.h>
void greeting(void)
{
    NSLog(@"hello world!");
}

demo.m :

#import <Foundation/Foundation.h>
void demo(void)
{
    NSLog(@"demo func");
}

于是Clang编译成 ARM64 格式且带bitcode的靶子文件test.o demo.o:

$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.m

下一场把个别只目标文件包为一个静态库文件:

$ xcrun -sdk iphoneos ar  -r libTest.a test.o demo.o
# ar: creating archive libTest.a

因而Shell命令otool查看目标文件中是否包含bitcode段:

$ otool -l test.o |grep bitcode
# Prints:
#   sectname __bitcode
#   sectname __bitcode

假若见到输出了2行sectname
__bitcode,就是证明及时静态库中的片个目标文件包含了bitcode.

2.脚将里面一个demo.m换成汇编语言再参与编译:

于是脚的一声令下将demo.m的C代码转换为ARM64凑编语言格式demo.s:

$ xcrun -sdk iphoneos clang -arch arm64 -S demo.m
$ cat demo.s
# Prints:
    .section    __TEXT,__text,regular,pure_instructions
    .ios_version_min 9, 2
    .globl    _demo
    .align    2
_demo:                                  ; @demo
    .cfi_startproc
; BB#0:
    stp    x29, x30, [sp, #-16]!
    mov     x29, sp
Ltmp0:
    .cfi_def_cfa w29, 16
Ltmp1:
    .cfi_offset w30, -8
Ltmp2:
    .cfi_offset w29, -16
    adrp    x0, L__unnamed_cfstring_@PAGE
    add    x0, x0, L__unnamed_cfstring_@PAGEOFF
    bl    _NSLog
    ldp    x29, x30, [sp], #16
    ret
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ; @.str
    .asciz    "demo func"

    .section    __DATA,__cfstring
    .align    4                       ; @_unnamed_cfstring_
L__unnamed_cfstring_:
    .quad    ___CFConstantStringClassReference
    .long    1992                    ; 0x7c8
    .space    4
    .quad    L_.str
    .quad    9                       ; 0x9

    .section    __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
    .long    0
    .long    0
    .subsections_via_symbol

然后去demo.m这个C源代码,仅留test.m和demo.s:

$ rm demo.m

如今,我们来将test.m这个C源代码和dmeo.s这个集编源代码来共带在-fembed-bitcode参数ca88官方会员登录来好成靶子代码并打包为一个静态库:

$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.s
$ xcrun -sdk iphoneos ar -r libTest.a test.o demo.o

接下来我们更运行otool工具来检查这个新的静态库中包含的2只目标文件是否还带有bitcode段:

$ ar -t libTest.a
# Prints:
# __.SYMDEF SORTED
# test.o
# demo.o
$ otool -l libTest.a | grep bitcode
# Prints:
#  sectname __bitcode

良意外,这等同次等,只发一行sectname
__bitcode输出,这就是印证及时简单单对象文件,有一个休带有bitcode段,哪怕我们于编译的时候指定了参数-fembed-bitcode也从来不用.至于具体是呀一个不带bitcode段,我们定懂得就是可怜起ARM64聚编语言编译过来的靶子文件未带.

这就是说就得出一个结论,bitcode的变更,是由汇编语言以上的上层语言编译而来,和太前边所说之那么,他是上层语言与汇编语言(机器语言)之间的一个当中码.

手上我们司空见惯的iOS应用开发中,一般不见面要因此到汇编层面去优化的代码.所以我们要关注第三在(开源)C代码,尤其是音视频编码解码这些计算密集型项目代码,关键计算的代码针对特定平台还发对承诺平台的汇编版本实现,当然为生C的落实,但是默认编译一般都是因此底汇编版本,这样即使见面导致我们于编译这个开源代码的时就你带来了-fembed-bitcode参数为仅仅只是让种受到的一些C代码的对象文件带了bitcode段,而那小数的汇编代码的靶子文件一律不带bitcode段,这样编译出这库房交给上层开发者使用的时刻,就会见现出于卷入上传或者真机调试之早晚坐Xcode默认开了bitcode功能要链接失败,导致未克真机调试要未可知上传应用及AppStore.

此文之初衷

近日于辅导自己戴维营战友们开手机音视频直播的App,调试之当儿手机采集音视频,视频用h264编码,音频采用aac编码,通过RTMP商量向斗鱼直播频道发布媒体流,项目用为此FFMPEG和libx264点儿单开源项目,在编译为iOS框架库提供于学生因此底时节,他们遇到了bitcode的题材,虽然可以使用直接关闭bitcode来避免不当,但是战友的求知欲要满足,格物致知,必须于该知其究竟.

libx264凡VideoLan基金会保管之一个视频编解码的开源项目,其大气以了逐一平台的多媒体汇编指令展开了优化,在编译为非带bitcode的库房底上,完全本官方autotools编译方法是从来不外问题的;编译全带bitcode的库底时段咱们只好关闭汇编优化,在执行./configure阶段可以添加–disable-asm参数来受用汇编.但是,这个选项在configure脚本中之兑现机制起问题.导致其仍调用了汇编的函数,但是汇编的代码却没编译进去,从而会招品种也确实机构建及包装的链接阶段会暴露找不至号的错误,这样即使不克得少咸其美.出于轻微程度的强迫症影响,故将前的FFMPEG和libx264档次的编译脚本进行了改进与打补丁.时就足以就一键编译出带全部bitcode的FFMPEG和libx264底框架了.

FFmpeg需要依赖libx264.

机动编译脚本项目位置放在github:
https://github.com/Diveinedu-CN/FFmpeg-iOS-build-script.git

鉴于时间与字数由,关于其他更多详细的音就非苗条道来了.

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图