69

我刚刚将我的 iPhone 4S 软件更新到 iOS 7 Beta 2,而我正在对一个新应用程序(Phonegap)进行最后的润色。这不是一个好主意!

完成后,Xcode 没有检测到我的 iPhone,所以我安装了 Xcode 5 beta。在修补它之后,我终于让它检测到我的手机。现在唯一的问题是使用的架构存在错误。

以下是正在产生的错误:

ld: warning: ignoring file /Users/-----------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a, file was built for archive which is not the architecture being linked (armv7s): /Users/--------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a
Undefined symbols for architecture armv7s:
  "_OBJC_METACLASS_$_CDVCommandDelegateImpl", referenced from:
      _OBJC_METACLASS_$_MainCommandDelegate in MainViewController.o
  "_CDVLocalNotification", referenced from:
      -[AppDelegate application:didReceiveLocalNotification:] in AppDelegate.o
  "_OBJC_CLASS_$_CDVCommandDelegateImpl", referenced from:
      _OBJC_CLASS_$_MainCommandDelegate in MainViewController.o
  "_OBJC_CLASS_$_CDVCommandQueue", referenced from:
      _OBJC_CLASS_$_MainCommandQueue in MainViewController.o
  "_OBJC_METACLASS_$_CDVViewController", referenced from:
      _OBJC_METACLASS_$_MainViewController in MainViewController.o
  "_OBJC_METACLASS_$_CDVCommandQueue", referenced from:
      _OBJC_METACLASS_$_MainCommandQueue in MainViewController.o
  "_CDVPluginHandleOpenURLNotification", referenced from:
      -[AppDelegate application:handleOpenURL:] in AppDelegate.o
  "_OBJC_CLASS_$_CDVViewController", referenced from:
      _OBJC_CLASS_$_MainViewController in MainViewController.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

关于应该更改架构以使其在我的手机上工作的任何想法?(它在模拟器上工作正常)

4

7 回答 7

105

简短的回答:

  • 从所有静态库的项目构建设置中删除仅构建活动架构(构建设置参数键为“ONLY_ACTIVE_ARCH”)或用“NO”覆盖它,如下面的屏幕截图所示: 将“仅构建活动架构”覆盖为“否”或完全删除它的条目以回退到 iOS 默认值

详细解答:

问题是您在主应用程序中链接的静态库“libCordova.a”仅针对一种架构(armv7,但不是 armv7s)编译。

您可能已经让 Xcode 为您的静态库项目执行所有建议的更改,而无需阅读这些更改实际上是什么。就我自己而言,当我切换到新版本的 Xcode 时,我从来没有费心仔细查看那个信息对话框(截图如下)——直到现在。 在此处输入图像描述

问题是执行这些更改会激活调试构建一个名为“仅构建活动架构”的新功能(构建设置参数键是“ONLY_ACTIVE_ARCH”)。原则上,这是 Xcode 的一个非常酷的增强功能,因为将其设置为 YES 会导致构建时间更快,因为 Xcode 仅在您点击运行按钮时编译您当前在顶部选择的连接设备的架构。

但是,当在静态库中盲目地接受这个新参数时,您可能会遇到这个错误。当您在连接 armv7 设备的同时构建静态库的调试版本,然后在调试主应用程序时连接了 armv7s 设备(反之亦然)时,就会出现该错误。随后,您将收到上述错误(或类似错误)。

所以我的建议是从所有静态库的项目构建设置中完全删除仅构建活动架构的项目级别的值。因为如果你看一下 iOS 默认值,它是 NO。当然,您也可以将设置覆盖为“否”以确保设置正确,即使将来默认值会更改(参见第一个屏幕截图)。

于 2013-06-26T18:24:29.297 回答
75

如果您的项目是使用 Cordova 2.x 和 Xcode 4.x 构建的,并且您收到 OP 提到的错误,则此解决方案对我有用。(我遇到了 Cordova 2.5 和 Xcode 5 的错误)。

https://issues.apache.org/jira/browse/CB-3768

转到您的 Cordova 项目

根文件夹 -> CordovaLib -> 右键单击​​ CordovaLib.xcodeproj -> 显示包内容 -> 打开 project.pbxproj

替换所有出现的(我有 4 个)

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
        /* other settings here */
};

有了这个

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos7.*]" = (
        armv7,
        armv7s,
    );
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
    /* other settings here */
};

现在您的项目将构建良好!

于 2013-09-19T14:35:48.160 回答
13

我已从armv7s部分中删除valid architectures,它对我有用。

构建设置 --> 架构 --> 有效架构

Xcode 构建设置

于 2013-10-24T06:49:22.993 回答
11

我正在使用 Xcode 5 所以 iOS SDK 7。对我有用的解决方案只是删除 arm64 架构。

选择项目目标(不是 CordovaLib.xcodeproj)并在构建设置>有效架构中,如果它在列表中,则删除 arm64。这是我删除 arm64 架构后的内容。

在此处输入图像描述

于 2014-03-23T22:45:51.003 回答
4

因为我的 lib.a 仅适用于 armv7

我所做的是

仅活动架构 = 是

buildSettings = {
                ALWAYS_SEARCH_USER_PATHS = NO;
                "ARCHS[sdk=iphoneos*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos6.*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos7.*]" = (
                    armv7,
                    armv7s,
                );

它的构建和归档很好

希望能帮助到你

于 2013-10-08T04:36:24.113 回答
2

njtman 有一个正确的答案。我没有代表发表评论,所以我正在添加更多细节。

您需要 iOS 7 SDK 才能使用标准架构(armv7、armv7s)。

我的项目默认为 (armv7),不包括 armv7s。

要解决此问题,请打开 CordovaLib.xcodeproj,在 Build Settings(顶行中的菜单之一,居中对齐)下,在架构、架构、调试和发布下,使用标准架构添加 iOS 7.0。

于 2013-10-04T03:18:29.037 回答
0

在构建设置...

Strip Debug Symbols During  Copy: 

Debug: No

Release: No
于 2013-10-09T06:25:52.523 回答