Xcode 5.1:libCordova.a 架构问题

81

昨天(3/10/14),iOS 7.1 发布时,我也升级了 Xcode 5.1,并发现我的 PhoneGap/Cordova 项目无法编译到我的 iPhone 5s。我还将 Cordova 升级到了最新版本:v 3.4.0-0.1.3。

我在 Stack Overflow 上读到了很多解决方案,涉及更改活动架构并仅构建活动架构,但它们都不起作用。以下是我尝试过的方法及其出现的错误。开始时,我遇到了这个错误:

missing required architecture arm64 in file <long file path omitted> libCordova.a
Undefined symbols for architecture arm64

因此,我尝试了以下步骤。我选择了我的项目中的CordovaLib子项目,并在项目和目标中都进入了构建设置 (Build Settings) 下的 架构 (Architectures),确保在任何Debug或Release架构中都不包含arm64。此时,仅构建活动架构 (Build Active Architecture Only) 设置为"Yes"。结果出现以下错误:

file was built for archive which is not the architecture being linked (armv7): 
<long file path omitted> libCordova.a
Undefined symbols for architecture armv7

仅构建活动架构设置为“否”,错误消息将再次出现:

missing required architecture arm64 in file <long file path omitted> libCordova.a
Undefined symbols for architecture arm64

我不确定还有什么其他的尝试方法。项目的架构设置只包括键值“Base SDK”,它被设置为iOS 7.1。项目的目标没有架构设置。无论如何,我相当肯定问题出在嵌入的CordovaLib子项目上。我应该怎么做才能使这个东西成功地编译到我的设备上?

更新:Apache的Jira上也有同样的问题:https://issues.apache.org/jira/browse/CB-6223


2
我有完全相同的问题。iOS 7.1和Xcode 5.1已经对开发人员可用了一段时间,所以令人失望的是,在它们发布之前,Cordova团队没有至少发出警告。 - Ade
是的。我使用最新安装的 Cordova 创建了一个全新的“Hello World”Cordova项目,但无法成功编译。 - inorganik
我使用这些设置编译成功,但是当我尝试验证存档时,出现了错误:**此捆绑包无效。包含armv7s架构的应用程序需要包含armv7架构。这很奇怪,因为看起来我已经包含了两者。 - Ade
不,我不相信它们会在没有 armv7s 的情况下编译成 5s。 - inorganik
3
修复Apache Cordova JIRA问题CB-6223的步骤:请修正并提交相关代码以解决此问题。 - Shazron
显示剩余3条评论
8个回答

86

@Shazron在Apache JIRA上发布了解决方案-他指出该问题修复将作为Cordova 3.5的一部分发布:

  1. 选择您的项目图标
  2. 选择“构建设置”。
  3. 对于“Architectures”,请选择$ ARCHS_STANDARD-标准架构(armv7,armv7s,arm64)
  4. 对于“Valid Architectures”,添加“arm64”
  5. 选择您的CordovaLib.xcodeproj图标
  6. 在项目的构建设置中(而不是目标),删除条件架构设置(悬停以查看减号)
  7. 对于“Architectures”,请选择$ ARCHS_STANDARD-标准架构(armv7,armv7s,arm64)
  8. 对于“Valid Architectures”,添加“arm64”
  9. 进行步骤6,但现在针对“Target”执行此操作

这是Shazron完整解决方案的链接:http://shazronatadobe.wordpress.com/2014/03/12/xcode-5-1-and-cordova-ios/

现在已经发布了解决方案,简要说明如下:

Cordova CLI 3.4.1-0.1.0已发布,其中包括Cordova iOS 3.4.1,其中包括此博客文章中提到的所有修复程序。更新您的Cordova CLI,如果您有现有项目,请执行“cordova platform update ios”。


10
好的。对于第六步,我的理解是我应该删除所有这些内容:SCREENSHOT,是吗? - Ade
1
一开始看起来没问题:应用程序可以存档和验证。但是,当导出为 ad hoc 分发时,它无法在 iPhone 5S 上运行。 - Ade
7
是的,这个答案可以让应用在5S上编译和安装,但当它开始运行时会抛出lldb错误并崩溃(或者如果你把设备连接到Mac并运行Xcode,则会暂停)。 - Jough Dempsey
5
这是@Shazron的帖子链接,涵盖3个问题:http://shazronatadobe.wordpress.com/2014/03/12/xcode-5-1-and-cordova-ios/ - stefbach
太好了。我之前遇到了15个奇怪的错误,现在它们都消失了 :). 谢谢。 - Tien Do
显示剩余7条评论

11

另一种可行的方法:

  1. 在项目导航器顶部点击你的项目(不是 Cordova.lib 子项目)。
  2. 在编辑窗格中,选择项目(不是目标),选择“Build Settings”编辑器选项卡,然后点击“所有”和“级别”按钮。
  3. 必要时展开“架构”组并找到其下的“架构”行。
  4. “架构”行中的第一列(已解决的)和第三列(iOS 默认值)将显示“Standard”,第二列(项目)将为空。
  5. 点击空白的第二列以弹出一个框,里面会有一行,“$(ARCHS_STANDARD)”。
  6. 双击该行使其可编辑,然后将其更改为“$(ARCHS_STANDARD_32_BIT)”。
  7. 点击框外确认更改。现在第一和第二个框中只有一个美元符号。
  8. 现在您应该能够构建了。

10

3
这个方法可行,唯一需要注意的是无法在运行iOS 7.1的iPhone上直接在XCode中进行测试。这时候模拟器就派上用场了。编译后的应用程序可以在iOS 7.1上运行(在iPhone 5和5S上确认过),因此降级到Cordova 3.5发布之前似乎是最好的选择。 - Ade
现在对我来说这是最好的方法。下载 Xcode 5.02 并将其复制 (首先将其命名为 XCode_502) 到“应用程序”中,使我可以在旁边运行 Xcode 5.1。 - EeKay
我已经降级到5.0.2,并在iOS 7.1上的iPhone 5和iPad 2上进行了测试,没有问题,我也已经顺利地提交了该应用程序到iTunes Connect。 - AlexLopezIT

8

他们刚刚发布了一个新版本3.4.1以解决这些问题。

因此,我更新了一个单独的文件,将其指向标签3.4.1:

/usr/local/lib/node_modules/cordova/platforms.js

第24行from:

version: '3.4.0'

to:

version: '3.4.1'

然后您需要在项目中删除iOS文件夹并运行:

cordova platform add ios

这将下载基于3.4.1的新模板,并包含所有补丁。

@JPRichardson 谢谢,我现在就要升级 :) - dk123
1
运行命令 "npm update cordova -g",然后执行 "cordova platform update ios" 来更新 iOS 平台。 - sepulturkey

5

你刚刚帮我省了好多麻烦。这个视频解决了我几个小时以来一直苦恼的问题。 - Bullyen
这对我很有帮助。感谢您制作这个视频——它让事情变得非常清晰。 - John Q

3
我通过先在XCode中单独构建CordovaLib项目,然后再构建我的项目,成功地使我的应用程序在XCode 5.1中构建。

这对我也起作用了。非常完美,因为我不能降级Xcode(也无法在iOS7.1设备上进行测试)。谢谢! - Adam Tuttle

2
你只需在每个语句和构建设置中添加arm64架构,我的意思是, 在您当前的项目以及cordova项目中。
对于您的项目:
- 架构 - 有效架构
在Cordova上:
- 架构 - debug - release - 任何iOS SDK
最重要的是
- Cordova构建设置中的有效架构
此配置会生成许多警告,但只需将警告所述的所有行中的"%d"更改为"%ld"即可。

1

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