VirtualBox中设置CentOS7

前言:写这篇重要是巩固下好在做事出中著录之坑。

前言

做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.

下载CentOS7镜像

此间用国内镜像地址比较好,之前用之匪是境内的,下载不下去,这发生硌坑哦.

阿里云境内CentOS7镜子像下载地址

历史回顾

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

安装步骤

  1. 以虚拟机中创造虚拟电脑
图片.png

  1. 分红虚拟电脑的内存大小

图片.png

此建议被个2G运行内存,可以叫虚拟机不会见太卡,大家都掌握嘛,

  1. 新建虚拟电脑

图片.png

此间不待开展变更,用之就是吓了。

4 . 创建磁盘文件类型

图片.png

当然了,这里创办磁盘类型也是为默认的,不用转就OK

  1. 编造磁盘分配

图片.png

此间用之为是默认的,动态分配大小

  1. 磁盘文件大小和职务分配

图片.png

可要修改的地方:

  1. centos
    右边的公文夹选项,这里是安装文件安装位置的,如果非开展设置,会用默认的,这时候若virtualbox安装于c盘,那若的虚拟机磁盘可能就是占有了c盘的高低了

  2. 亟待转移的凡磁盘大小,一开始默认的是8g,我们可以它调大点

  3. 挑选点击文件夹位置,弹出新弹框

图片.png

此间以前面来安设置过其它虚拟机磁盘位置,显示的是于D盘,因为自身的D盘剩余空间还是蛮大的,所以选择以D盘,再拓展封存,回到上单页面,进行保存。

  1. 保存后会多有一个虚构电脑

图片.png

  1. 安网卡

图片.png

此展开网卡的装置,我们暂时就因此NAT网卡模式就是推行

  1. 光驱的安

图片.png

  1. 选镜像(ISO文件)

图片.png

  1. ISO文件选择得页,点确定

图片.png

  1. 择启动

图片.png

  1. 安装centos7的初始界面

图片.png

此开一下证实:白色的凡意味着选择,默认进去的是亚单,这里我们选取第一只白之栏目:Install
CentOS 7
即可

15 安装界面:

图片.png

  1. 语言设置界面

图片.png

  1. 装选项设置

图片.png

  1. 装位置设置

图片.png

选中点完成。

  1. 网络设置(这里是根本,一定要是拓展网络安装)

图片.png

顿时是自家踩过的一律介乎坑,当时于网中将,搞了半天。。。蛋疼。。。

  1. 用户ROOT密码设置,及账号设置

图片.png

  1. 创立用户安装

图片.png

连下点得就可了,一会我们就可以看到安装到位还开的界面了。

  1. 跻身centos7,开始我们的linux系统

图片.png

面就是自身所涉之,这对准小白熟悉接触linux,在安装系统所有助。

编译器现状

乘活动装备移动互联网的深刻发展,现在活动设备中之主次大小变换得越来越重要了,主要是以移动设备中无会见来处理器及那坏的一个硬盘驱动器.还有即使是苹果曾由旧之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.

施行产生真正懂

咱们还是该实际施行两单测试代码进行实施和检察一下比较好.做少不好测试,第一不良准备简单独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.

此文之初衷

前不久当辅导自己戴维营战友等做手机音视频直播的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开发精品文章:戴维营技术博客

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图