编译iOS 7的x264

我在为iOS编译x264时出错。

我有苹果LLVM 5.0版(clang-500.2.75)(基于LLVM 3.3svn)Xcode版本5.0(5A1413)。 我正在编译x264-snapshot-20130925-2245。

configuration:

CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang ./configure \ --host=arm-apple-darwin \ --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk \ --prefix=armv7 \ --extra-cflags='-arch armv7' \ --extra-ldflags="-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/system -arch armv7" \ --enable-pic \ --enable-static 

出错:

 common/arm/cpu-aS:29:7: error: unknown token in expression .align ^ common/arm/cpu-aS:139:5: error: instruction 'suble' can not set flags, but 's' suffix specified subles ip, ip, #1 ^ 

Xcode 5工具链中的相关更改是,LLVM编译器现在默认使用内置汇编程序,而内置汇编程序则需要更严格地遵守ARM Unified Assembly Language。

有两种方法可以使用Xcode 5工具链进行编译:

  1. 给铛标志 – 没有整合为。 将它添加到–extra-cflags应该可以工作。 (该标志为我编译单个文件工作,但我从来没有configuration过。)考虑这个解决方法。

  2. 将汇编源代码修复到x264的common / arm子目录中。 实际上这很容易,这就是我所做的。 这是正确的修复。 顺便说一句,我将要提交一个补丁到x264这些变化。

汇编器发出很多错误,它们分为四类:

  • 在cpu-aS中,“.align”指令应该是“.align 2”。 (显然它用于默认为2,现在2必须是明确的。)

  • 在多个文件中的几个游戏和sublts说明。 这些是“sub”(减号)的变体,后跟条件(2个字符)和“s”后缀。 现在“s”必须先于条件。 因此“subles”=>“subsle”和“sublts”=>“subslt”。

  • 各种文件中相当数量的ldrd指令。 这个指令的意思是“加载寄存器,双(从存储器)”。 它从存储器中将2个32位字加载到寄存器中。 以前只需要命名第一个寄存器就行了。 现在都需要命名。 他们总是相邻的。 所以“ldrd r2,不pipe”需要变成“ldrd r2,r3,不pipe”。 “lrdrd r6,某事”变成“lrdrd r6,r7,某事”。 等等。

  • 在像素aS中,有一条指令“vmov.32 r0,r1,d0”。 这是不正确的。 vmov.32意味着移动一个32位的数量,但是参数表示将d0(64位)移动到r0和r1。 显然老编译器把“.32”部分作为提示。 我相信它应该是“vmov r0,r1,d0”,这个变化对我来说是有效的,但是我没有绝对的证据来certificate这是正确的。

非常感谢苹果开发者论坛上的gparker! 没有他/她的帮助,我无法想象这一点。 链接到论坛讨论,需要Apple ID。

到目前为止,唯一的解决scheme似乎是--disable-asm

我认为禁用汇编优化是一个不好的解决scheme。

经过长时间的研究,我发现问题的根源:汇编程序编译期间使用ASFLAGS而不是CFLAGS,因此添加–extra-asflags =“ – arch armv7”解决了问题

 ./configure \ --host=arm-apple-darwin \ --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk \ --prefix=armv7 \ --extra-cflags="-arch armv7" \ --extra-asflags="-arch armv7" \ --extra-ldflags="-arch armv7" \ --enable-pic \ --enable-static 

注:对于位代码的支持只是添加-fembed-bitcode所有额外的标志参数