交叉编译的原理

  • 本机编译
    使用本机器的编译器,将源代码编译链接成为一个可以在本机器上运行的程序。这就是正常的编译过程.

  • 交叉编辑
    就是在一个平台(如PC)上生成另外一个平台(Android、iOS或者其他嵌入式设备)的可执行程序,相较于正常编译,下面来看一下交叉编译的相应角色。首先,最终程序运行的设备就是Android或者iOS设备,源代码就是从第三方开源网站上下载的源代码,编译机器就是我们的PC,而编译器也必须要安装到该PC上。但是这里对编译器是有特殊需求的,最终程序运行的系统必须要提供可运行在PC上的编译器,而该编译器就是大家常说的交叉工具编译链
    了解了交叉编译之后,大家应该能够理解交叉编译存在的必要性了。在一般的嵌入式系统开发中,运行程序的目标平台其存储空间和运算能力都是有限的,尽管现在的iOS和Android设备拥有越来越强劲的计算能力,但是在这种嵌入式设备中进行本地编译是不太可能的,一则是因为计算能力的问题还有一个重要的原因就是编译工具以及整个编译过程异常繁琐,所以在这种情况下,直接在ARM平台下进行本机编译几乎是不可能的。而具有更加强劲的计算能力与更大存储空间的PC才是理想的选择,所以大部分的嵌入式开发平台都提供了本身平台交叉编译所需要的交叉工具编译链,通过该交叉工具编译链,开发者就能在PC上编译出可以运行在ARM平台下的程序了。
    无论是自行安装PC上的编译器,还是下载其他平台(Android或者iOS)的交叉工具编译链,它们都会提供以下几个工具

    • ·CC:编译器,对C源文件进行编译处理,生成汇编文件。
    • AS:将汇编文件生成目标文件(汇编文件使用的是指令助记符,AS将它翻译成机器码)。
    • AR:打包器,用于库操作,可以通过该工具从一个库中删除或者增加目标代码模块
    • LD:链接器,为前面生成的目标代码分配地址空间,将多个目标文件链接成一个库或者是可执行文件。
    • GDB:调试工具,可以对运行过程中的程序进行代码调试工作。
    • STRIP:以最终生成的可执行文件或者库文件作为输入,然后消除掉其中的源码。
    • NM:查看静态库文件中的符号表。
    • Objdump:查看静态库或者动态库的方法签名。
  • arm64的指令集;Valid architectures选项指即将编译的指令集,一般设置为armv7armv7sarm64,表示一般会编译这三个指令集;Build Active Architecture Only选项表示是否只编译当前适用的指令集,一般情况下在Debug的时候设置为YES,以便可以更加快速、高效地调试程序,而在Release的情况下设置为NO,以便App在各个机器上都能够以最高效率运行,因为Valid architectures选择的对应指令集是armv7、armv7s和arm64,在Release下会为各个指令集编译对应的代码,因此最后的ipa体积基本上翻了3倍。
    基于上面的描述,以及设备与指令集平台的对比,大多数情况下,我们在实际的交叉编译过程中只编译armv7与arm64这两个指令集平台下的库,因为armv7s设备的数量比较少,有armv7来保底完全是可以运行的,并且armv7到armv7s指令集的变动又比较少,而arm64的变动则比较大,设备数量也比较多,所以需要单独编译出来,以保证这一批设备可以享受到最优质的运行状况。

  • LAME是目前非常优秀的一种MP3编码引擎,在业界,转码成MP3格式的音频文件时,最常用的编码器就是LAME库。当达到320Kbit/s以上时,LAME编码出来的音频质量几乎可以和CD的音质相媲美,并且还能保证整个音频文件的体积非常小,因此若要在移动端平台上编码MP3文件,使用LAME便成为唯一的选择。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值