更新到Xcode 5之后-ld:找不到架构armv7或armv7s链接器错误的符号


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)

为了使该架构在我的手机上正常工作,对架构应更改为什么的任何想法?(在仿真器上工作正常)


您的构建设置->建筑中有什么?
poiuytrez

我只有一个:$(ARCHS_STANDARD_32_BIT),在有效架构下,我有:armv7和armv7s
barney

Answers:


104

简短答案:

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

详细答案:

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

您可能已经让Xcode为您的静态库项目执行了所有建议的更改,而没有阅读这些更改的实际含义。就我自己而言,当我切换到新版本的Xcode时,我从来没有费心仔细看过该信息对话框(如下图所示)-直到现在。 在此处输入图片说明

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

但是,当在静态库中盲目接受此新参数时,您可能会遇到此错误。在连接armv7设备时构建了静态库的调试版本,然后在调试主应用程序时,已连接armv7s设备(反之亦然)时,会发生该错误。随后,您将得到上面的错误(或类似错误)。

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


没为我工作。我在模拟器上。还有其他东西吗?
Van Du Tran 2013年

@Tafkadasoh您是否知道如何在Xcode 5中禁用此警告(不禁用其他任何与源代码相关的警告)?
user1264176 2013年

有一个有助于我使用此信息的说明:请注意,您需要在CordovaLib.xcodeproj目标(我使用的是PhoneGap 2.9)中进行建议的更改,而不仅仅是在PhoneGap应用程序目标中进行更改。如果您没有在CordovaLib目标中进行更改,那么即使清理/构建也不会强制libCordova.a使用正确的体系结构进行构建。
JA_251 2013年

在弄清楚基本上相同的事情之后,我找到了这个答案(感谢您验证我认为是正确的解决方案!)。las,这没什么用,我仍然遇到很多错误。(在尝试将arm64添加到混合中,然后再将其更改后,所有这些对我来说都是南方的。)
Joe D'Andrea

1
@rkaartikeyan只需在项目设置中选择相应的行(请参阅第一个屏幕截图),然后按Backspace键。
塔夫卡达索

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 */
};

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


与Cordova 2.7和XCode 5完美兼容。–
Dave Reynolds

4
Tafkadasoh的解决方案对我不起作用。这样完美!谢谢。
JP理查森

使用Cordova 2.6项目对我来说非常有效。我很惊讶无法通过xcode用户界面输入“ iphoneos7。*” ...
plang

Cordova 3.1
Ghigo

@Ghigo如我的回答所述,此解决方案仅适用于Cordova2.x。这些设置在Cordova 3.x中应该已经或多或少存在,因为它从一开始就支持iOS7。
njtman 2013年

13

我已删除armv7svalid architectures部分,它为我工作。

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

Xcode构建设置


1
我正在更新到Xcode 5.1(与iOS 7.1同时发布)。我结束了删除armv7 armv7s之外的所有有效架构的工作。然后,我的phonegap应用程序进行编译和构建。
Thomas-BeeDesk 2014年

@ Thomas-BeeDesk:但是你知道这会发生什么吗?在某种程度上,我们放弃了对build64位二进制文​​件的支持,现在仅生成32个二进制文件?有什么想法...如果该库不支持64位,为什么在64位设备上的xcode 5.0和ios 7.0上运行它时也没有错误?
Ankit 2014年

@ankit,我相信iPhone中的所有CPU都是向后兼容的(到目前为止)。中的代码libCordova.a将仅以32位指令运行。无论如何,我们的应用程序大部分应该是在本机UIWebView中执行的JavaScript,我认为这并不重要,也不会产生明显的性能影响。
托马斯-BeeDesk 2014年

11

我使用的是Xcode 5,所以使用的是iOS SDK7。对我有效的解决方案只是删除arm64体系结构。

选择项目目标(NOT CordovaLib.xcodeproj),然后在构建设置>“有效体系结构”中,删除arm64(如果在列表中)。删除arm64体系结构后,这是我的。

在此处输入图片说明


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,
                );

它被构建并存档良好

希望能帮助到你


1
我相信您可以清理项目,这将强制重建库并针对当前连接的设备进行编译。不需要更改Build Active Architecture标志,这样做只会在调试时不必要地延长构建时间。这将消除调试时部署到不同设备类型时的错误。要使用xcode清洁项目,请转到产品->清洁。(或命令+ Shift + K)
新泽西州曼城

亲爱的njtman,是的,是的,只是清理项目即可找到所连接设备的工作。但是对我来说,我必须为未连接的设备归档项目。但是我把它存档了...问题仍然存在。所以我尝试了这个,它对我有用:)。顺便说一句,谢谢你的提示。
ruzticgirlz

@ hypery2k您怎么知道您的lib.a仅适用于armv7?
June Wang

3

恩特曼回答正确。我没有代表对此做评论,所以我要添加更多详细信息。

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

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

要解决此问题,请在“构建设置”下(顶部行中的菜单之一,居中对齐)下的“ CordovaLib.xcodeproj”,在体系结构,体系结构,调试和发行版下,使用标准体系结构添加iOS 7.0。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.