我在为iOS编译x264时遇到错误。
我有带有Apple LLVM 5.0版(clang-500.2.75)的Xcode版本5.0(5A1413)(基于LLVM 3.3svn)。我正在编译x264-snapshot-20130925-2245。
配置:
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-a.S:29:7: error: unknown token in expression
.align
^
common/arm/cpu-a.S:139:5: error: instruction 'suble' can not set flags, but 's' suffix specified
subles ip, ip, #1
^
答案 0 :(得分:5)
Xcode 5工具链中的相关更改是LLVM编译器现在默认使用内置汇编程序,而内置汇编程序需要更严格地遵守ARM统一汇编语言。
有两种方法可以使用Xcode 5工具链进行编译:
给clang标志-no-integrated-as。将它添加到--extra-cflags应该可行。 (该标志为我编译单个文件,但我从未将其用于配置。)请考虑这是一种解决方法。
将汇编源代码修复到x264的common / arm子目录中。实际上这很简单,这就是我所做的。这是正确的解决方案。顺便说一句,我即将通过这些更改向x264提交补丁。
汇编程序会发出许多错误,它们分为四类:
在cpu-a.S中,“。align”指令应为“.align 2”。 (显然它曾经默认为2,现在2必须是明确的。)
多个文件中的几个subles和sublts指令。这些是“sub”(减法)的变体,后跟条件(2个字符)和“s”后缀。现在,“s”必须先于条件。因此“subles”=> “subsle”和“sublts”=> “subslt”。
各种文件中的相当数量的ldrd指令。该指令表示“加载寄存器,双(从存储器)”。它将2个32位字从存储器加载到寄存器中。以前只能命名第一个寄存器;现在两者都需要命名。他们总是相邻的。所以“ldrd r2,无论什么”都需要成为“ldrd r2,r3,无论如何”。 “ldrd r6,某事”成为“ldrd r6,r7,某事”。等
在pixel-a.S中,有一条指令“vmov.32 r0,r1,d0”。这是不正确的。 vmov.32表示移动32位数量,但参数表示将d0(64位)移动到r0和r1。显然,旧的编译器将“.32”部分作为提示。我认为它应该是“vmov r0,r1,d0”,这种改变对我有用 - 但我没有绝对的证据证明这是正确的指示。
非常感谢Apple开发者论坛上的gparker!没有他/她的帮助,我无法想出这个。 Link to forum discussion, Apple ID required.
答案 1 :(得分:0)
到目前为止,唯一的解决方案似乎是--disable-asm
。
答案 2 :(得分:0)
我认为禁用汇编程序优化是一个糟糕的解决方案。
经过长时间的研究,我找到了问题的根源:汇编程序编译期间的clang使用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
注意:对于bitcode支持,只需将-fembed-bitcode
添加到所有额外的标志参数