【问题标题】:After update to Xcode 5 - ld: symbol(s) not found for architecture armv7 or armv7s linker error更新到 Xcode 5 后 - ld: symbol(s) not found for architecture armv7 or armv7s linker error
【发布时间】:2013-06-23 01:28:10
【问题描述】:

我刚刚将我的 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)

对于架构应该改变什么以使其在我的手机上工作有什么想法吗? (在模拟器上运行良好)

【问题讨论】:

  • 您的构建设置 -> 架构中有什么?
  • 我只有一个:$(ARCHS_STANDARD_32_BIT) 并且在有效架构下我有:armv7 和 armv7s

标签: cordova static-libraries cpu-architecture ios7 xcode5


【解决方案1】:

简答:

  • 从所有静态库的项目构建设置中删除 Build Active Architecture Only(构建设置参数键为“ONLY_ACTIVE_ARCH”)或使用“NO”覆盖它,如下面的屏幕截图所示:

详细回答:

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

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

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

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

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

【讨论】:

  • 对我不起作用。我在模拟器上。还有什么遗漏吗?
  • @Tafkadasoh 你知道如何在 Xcode 5 中禁用此警告(不禁用任何其他与源代码相关的警告)吗?
  • 帮助我使用此信息的说明:请注意,您需要在 CordovaLib.xcodeproj 目标(我使用的是 PhoneGap 2.9)中进行建议的更改,而不仅仅是您的 PhoneGap 应用程序目标。如果您不在 CordovaLib 目标中更改它,即使是 clean/build 也不会强制 libCordova.a 使用正确的架构构建。
  • 我在弄清楚基本相同的事情后找到了这个答案(感谢您验证我认为正确的解决方案!)。唉,这并没有什么不同,而且我仍然遇到很多错误。 (在尝试将 arm64 添加到组合中,然后将其更改回来之后,这一切都对我不利。)
  • @rkaartikeyan 只需在项目设置中选择相应的行(参见第一个屏幕截图)并按退格键。
【解决方案2】:

如果您的项目是使用 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 */
};

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

【讨论】:

  • 与 Cordova 2.7 和 XCode 5 完美配合。
  • Tafkadasoh 的解决方案对我不起作用。这完美!谢谢。
  • 使用 Cordova 2.6 项目对我来说效果很好。我很惊讶无法通过 xcode 用户界面创建“iphoneos7.*”条目...
  • Cordova 3.1 似乎不再是这种情况了
  • @Ghigo 正如我的回答所述,此解决方案仅适用于 Cordova 2.x。这些设置应该已经或多或少存在于 Cordova 3.x 中,因为它从一开始就支持 iOS7。
【解决方案3】:

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

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

【讨论】:

  • 我正在更新到 Xcode 5.1(与 iOS 7.1 同时发布)。我结束了删除所有有效架构 except armv7 armv7s。然后,我的 phonegap 应用程序编译和构建。
  • @Thomas-BeeDesk:但是你知道这是怎么回事吗?在某种程度上我们放弃了对 build64 位二进制文​​件的支持,现在只会生成 32 位二进制文​​件?任何想法...如果库不支持 64 位,为什么我在 64 位设备上的 xcode 5.0 和 ios 7.0 上运行它时没有错误?
  • @ankit,我相信 iPhone 中的所有 CPU 都是向后兼容的(到目前为止)。 libCordova.a 中的代码将仅使用 32 位指令运行。无论如何,我们的应用程序的大部分应该是在本机 UIWebView 内执行的 JavaScript,我认为这并不重要或会对性能产生重大影响。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    我做的是

    仅活动架构 = 是

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

    它已构建并存档

    希望对你有帮助

    【讨论】:

    • 我相信你可以清理你的项目,这将强制重建库并为当前连接的设备编译它。不需要更改 Build Active Architecture 标志,这样做只会在调试时不必要地延长构建时间。在调试时部署到不同的设备类型时,这应该可以消除错误。要在 xcode 中清理您的项目,请转到 Product->Clean。 (或 command + shift + K)
    • 亲爱的 njtman,是的,你是对的,只需清理项目即可为连接的设备找到工作。但对我来说,我必须为未连接的设备存档项目。但是我将其存档...问题仍然存在。所以我试试这个,它对我有用:)。顺便说一句,谢谢你的小费。
    • @hypery2k 你怎么知道你的 lib.a 只适用于 armv7?
    【解决方案6】:

    njtman 有一个正确的答案。我没有代表发表评论,因此我正在添加更多详细信息。

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

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

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

    【讨论】:

      【解决方案7】:

      在构建设置中...

      Strip Debug Symbols During  Copy: 
      
      Debug: No
      
      Release: No
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-31
        • 2015-04-23
        • 2019-07-20
        • 2016-05-21
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        相关资源
        最近更新 更多