ARMv6和ARMv7的条件编译

9
我有一个已发布的应用程序,支持amrv6和armv7。现在我有一个升级版本,只兼容armv7(我添加了一个依赖于armv7的外部库)。当我尝试将应用程序提交到商店时,我会收到错误,详细信息请参见此处
我理解之前的错误,并需要更改我的应用程序以支持两种体系结构。我的问题是,我的代码依赖于仅与armv7兼容的库。如果我更改项目属性以支持armv6和armv7,则会出现编译错误(详细信息如下)。我需要能够编译支持两种体系结构的代码: 使用我所依赖的库编译armv7 armv6具有不依赖于该库的不同代码。
我该怎么做?
错误详细信息:
• 编译崩溃在一个Lib文件(.a)中,错误提示为: ld: warning: directory not found for option '-L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/gcc/arm-apple-darwin10/4.0.1' ld: in /Users/.../(lib file).a, file is universal but does not contain a(n) armv6 slice for architecture armv6 Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 failed with exit code 1
提前感谢。

3
你可能希望在问题中添加iOS和Xcode标签。这更多是关于如何使用这个工具链生成通用二进制文件的问题,而不是编写ARM汇编语言的架构相关分发器的问题。 - Z.T.
6个回答

4
我意识到我上一个答案不正确... 苹果公司说这是不可能的,但这并不完全正确... 感谢Jim,我进行了更多搜索,并找到了一种方法来实现它。
  1. "Build Phases"中删除lib。
  2. "其他链接器标志"(构建设置)中添加两个体系结构,需要点击+并添加armv6和armv7。
  3. 将库添加到armv7中,使用-l
  4. 不要忘记在您的代码中添加#if defined _ARM_ARCH_7
这就像Jim所回答的,但更详细。

2
我收到了苹果公司的回复:
您不能有选择地为armv6或armv7构建应用程序。您的静态库必须为armv6和armv7两者构建,因为您的应用程序支持这两种架构...您可以通过将iOS部署目标设置为4.3或更高版本来停止支持armv6。
基本上,我需要询问库的开发人员来为这两种架构进行构建( =/ ),或者我将我的最低目标设置为4.3并仅使用armv7。

1
在您的构建设置中,如果将鼠标悬停在设置上,则会出现一个符号 +,您可以单击它来将设置范围限定到特定的架构。您需要从库的常规列表中删除该库,并通过手动传递 -L 参数将其添加仅用于 armv7。您可能还需要添加预处理器定义,以便在调用库的代码周围放置 #ifdef编辑:想一想,您可能可以通过在构建阶段部分将库标记为可选来更简单地完成此操作。

1
谢谢!但我不明白“从库的常规列表中删除库”在哪里/什么地方,我更改了“库搜索路径”和“其他链接器标志”,使用+我创建了两行,分别为armv6和armv7。但现在我有一个新的错误,详细信息显示“..找不到l(lib).a”...某些内容正在调用Lib..我在代码中删除了所有证据以及构建阶段部分中的“可选项”...所以可能我需要在“正常列表”中将其删除,就像你所说的那样。 - silvaric
我给了你两个选择。你不应该同时尝试做两件事。 - Jim

0
我在使用Google Analytics iOS SDK时遇到了一个问题,但仅仅是将库替换为最新版本就解决了这个问题。

0

抱歉,我从剪贴板中粘贴了错误的内容。

我想说的是:

只需从目标 Aguilar 设置的有效架构中删除错误的架构,你就可以顺利进行 :)


0

我也遇到了同样的问题,所以我将“Build Activate Architecture Only”(在目标->构建设置中)改为是

这个方法…目前可以解决

我想我的应用程序在iPhone 5上可能无法运行,但我必须等待我使用的静态库的供应商为armv7 / armv7s构建它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接