Xcode4 链接问题。文件是为存档构建的,而链接的架构不是(arm6)。

50

最近我切换到Xcode4,编译我的项目时出现以下错误。

ld: warning: ignoring file /Users/myname/Library/Developer/Xcode/DerivedData/appname-hezrgyqimckztgbdlslkavphdclw/Build/Products/Debug-iphoneos/libTapkuLibrary.a, file was built for archive which is not the architecture being linked (armv6)
Undefined symbols for architecture armv6:
  "_OBJC_CLASS_$_TKLoadingView", referenced from:
      objc-class-ref in RootViewController.o

我打开了TapkuLibrary并检查了它的架构设置为“标准(armv6 armv7)”。

我应该怎么做才能解决这个问题?

17个回答

111

我找到了问题的原因。我将TapkuLibrary的“Build Active Architecture Only”设置从Yes更改为No,它就可以成功编译了。


2
哎呀,我把“是”改成了“否”。 - Seunghoon
“build active architecture only”设置在哪里? - Oscar
2
那么,我可以这样假设吗?如果我有一个存在这个问题的第三方库,如果我无法重新编译该库,那么我就无法自行修复它? - lilbyrdie

35

我通过执行与被接受的答案相反的操作来解决了这个问题 - 我将“仅构建活动架构”从 NO 更改为 YES。


同样的问题 - 在配置文件方面也涉及到了一些巫术。 :) - dijipiji

11

当我将XCode升级到4.5并将iOS升级到iOS6时,我遇到了这个问题。对于GMGridView而言,它只是发生了。但只有在设备上出现,而不是模拟器上。

我通过以下步骤解决了这个问题: 1)进入GMGridView项目->构建设置 2)在设置->体系结构下,选择“标准(armv7,armv7s)”

然后清除所有内容(包括DerivedData)并重新构建。

希望能有所帮助!


非常感谢分享!我遇到了同样的问题,使用这个库解决了它。 - adriandz

11

我遇到了同样的问题,不过原因可能不一样。我使用了为模拟器构建的library.a文件,并试图在设备上运行它...后来发现我需要为模拟器和设备分别使用不同的.a文件。希望这能对某人有所帮助;)

例如,这里我导入了不同的库文件用于设备和模拟器


我遇到了完全相同的问题。你说的模拟器需要不同的.a文件是什么意思? - Luda
这里我为您附上了一张截图。如果您在项目中导入了.a库文件,则需要两个文件。一个是用于模拟器,另一个是用于设备。根据您的需求进行导入。 - Zaraki
您可以使用lipo命令行工具将两个库(模拟器和设备)编译到同一个文件中。分别构建两个库(模拟器和发布存档),然后进入它们被构建的Build/Products目录,使用lipo -create Release-iphoneos/libsbjson.a Debug-iphonesimulator/libsbjson.a -output libsbjson.a命令。 - Dan Sandland
我按照你的建议去做了,但是却得到了这个错误信息:ld: file is universal (2 slices) but does not contain a(n) armv7s slice: /Users/admin/dev/iphone/buildOutput/Debug-iphoneos/libThree20Core.a for architecture armv7s -> 请注意,我已经在设备目录中替换了.a文件。 - abbood

6
尝试移除armv6架构,仅为armv7编译。

3
那个也解决了问题,但是我不想将我的应用限制在只支持armv7的新设备上。谢谢! - Seunghoon
这对我很有效,但我仍然想支持旧设备,你有其他的解决方案吗? - Tuyen Nguyen
我该如何在 Xcode 中移除静态库中的 armv6 或 x86_64 架构?我可以像这里(http://atnan.com/blog/2012/01/12/avoiding-duplicate-symbol-errors-during-linking-by-removing-classes-from-static-libraries) 那样通过命令行来做到,但是在 Xcode 中该如何实现呢? - Khaled Annajar

2

我通过点击“不友好”的项目(在我的情况下是GMGridView)来完成了这个操作。 在“架构”选项卡中,我将值从某个值(我不再完全记得了,我猜测应该是:)“armv7, armv6s”更改为“armv7, armv7”。 之后它对我起作用了。


2
这对我解决了问题:
一些外部库(例如three20)对“Build Settings-> Architectures-> Any iOS SDK”进行了额外的设置,其值为“armv6 armv7”,与标准的“armv7 armv7s”不同。选择“Standard”即可解决问题。

2

对我有用的另一件事是确保所有子项目的架构设置为armv6和armv7,确保设置每个子项目的TARGET和PROJECT。清理并重新构建所有内容后,它可以正常工作。


1
这对我有用:
单击有问题的框架的“项目”文件(xcodeproj)。 进入框架“项目”(而不是“目标”)的“信息”选项卡。 展开“配置文件”,确保“Debug”和“Release”都设置了2个配置 - 一个用于框架的“项目”,另一个用于框架的“目标”。 对于框架来说,“Target”编译成库而不是应用程序,所以很容易混淆。 “Debug”应该将项目设置为“Debug”,将库设置为“Shared” “Release”应该将项目设置为“Release”,将库设置为“Shared” 编译,运行并享受。 如果你试图弄清楚这个问题,最终搞乱了整个项目,那么你可能需要仔细检查应用程序的项目构建阶段(正如Gon所建议的)。即使它在驱动器上不存在,库也应该在那里以红色突出显示。如果没有,请确保将其设置为“共享”,然后可以将其添加回来。 如果您真的真的真的搞乱了项目,那么您可能被迫清除DerivedData文件夹,就像russes所建议的那样。此外,请检查“组织者”,因为Xcode有一种在各个位置保存垃圾的方法。 哦,还有,你检查过是否存在“armv6”吗? :)

1
如果我收到忽略文件的警告 - 我会在被忽略的文件上运行 lipo -info 命令来查找它的架构,如下所示。
lipo -info libTapkuLibrary.a

这将会输出i386、armv6、armv7、armv7s、x86_64等架构之一。通常,该架构必须与您的目标构建平台匹配。例如:

  • i386 = iOS模拟器或Mac OS X上的32位构建
  • armv6 armv7 arm7s = iOS设备
  • x86_64 = Mac OS X上的64位构建

根据不匹配的情况,您要么必须为您的目标平台重新构建库,要么更改目标平台。

注意:对于fat二进制文件,“lipo -info”将打印上述架构的组合。


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