我在为 iOS 编译 x264 时遇到错误。
我有 Xcode 版本 5.0 (5A1413) 和 Apple LLVM 版本 5.0 (clang-500.2.75)(基于 LLVM 3.3svn)。我正在编译 x264-snapshot-20130925-2245。
Config:
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
^
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,某事”。 ETC。
在pixel-a.S中,有一条指令“vmov.32 r0, r1, d0”。这是不正确的。 vmov.32 表示移动 32 位量,但参数表示将 d0(64 位)移动到 r0 和 r1 中。显然旧编译器将“.32”部分作为提示。我相信它应该是“vmov r0,r1,d0”并且该更改对我有用 - 但我没有绝对的证据证明这是正确的指令。
非常感谢 Apple 开发者论坛上的 gparker!如果没有他/她的帮助,我无法弄清楚这一点。链接到论坛讨论,需要 Apple ID。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)