文件是为存档而构建的,而不是要链接的体系结构 (i386)

file was built for archive which is not the architecture being linked (i386)

提问人:yarlg 提问时间:5/30/2012 最后编辑:Eino Gourdinyarlg 更新时间:1/21/2020 访问量:76005

问:

我必须构建静态库。我想在我的 iPhone 和 ipad 应用程序中使用。当我尝试运行模拟器时,我得到了链接错误。我是 iOS 开发的新手。请帮忙;

ld:警告:忽略文件 /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a,文件 是为存档而构建的,它不是链接的体系结构 (i386版)体系结构 i386 的未定义符号:“
_OBJC_CLASS_$_netUtils”,引用自: ViewController.o 中的 objc-class-ref ld:找不到架构 i386 的符号 clang:错误:链接器命令失败,退出代码为 1 (使用 -v 查看调用)

我尝试在架构中添加 i386。但没有运气

ios iphone xcode ipad linker-错误

评论


答:

5赞 CodaFi 5/30/2012 #1

这意味着您尝试使用的库不是针对 iOS 模拟器进行通用编译的(i386 符号用于 Mac)。不过,在实际设备上运行它应该可以正常工作。

9赞 Alexander Bekert 5/30/2012 #2

我实际上不知道我的建议是否正确,但请尝试检查一下:

  • 选择您的项目
  • 选择“Build Settings”
  • 检查架构:
    • 有效的体系结构应为“armv6 armv7”
    • 支持的平台应该是“iphonesimulator iphoneos”(也许是 iPad,我不知道)
    • 基础 SDK – 您的 iOS SDK(我有 iOS 5.0)。

如果我是队长,请不要评判我:)

评论

17赞 TPoschel 8/22/2012
除了 Alexander 的建议之外,我还建议您确保将“仅构建活动架构”设置设置为“否”。最近这让我绊倒了。
77赞 Cody A. Ray 1/4/2013 #3

在与同样的问题作斗争并遵循所有公认的答案(更新生成设置、清除链接器搜索路径等)之后。我终于找到了一个适合我的答案。

在构建之前,请确保选择正确的类型(iPhone 模拟器)而不是 iOS 设备。然后重建。否则,您将尝试在 Mac (i386) 上的模拟器上使用为 iOS 设备(arm 处理器)构建的库。本来应该是显而易见的,但事实并非如此。

以前:

iOS Device Settings

后:

iPhone 5.1 Simulator Settings

现在,查看“导航器”中的“产品”组>右键单击静态库(.a 文件)>“在 Finder 中显示”,您会注意到它位于 Debug-iphonesimulator 文件夹中,而不是 Debug-iphoneos。我最初没有注意文件夹名称,否则我可能会更早想到这一点。

希望这会有所帮助。

评论

0赞 Danny 5/23/2013
这为我解决了这个问题。有很多方法可以为你不打算的架构构建,未来的搜索者可能想浏览其中的许多答案,看看你是否遇到了适用于你的答案!
0赞 Nour Helmi 12/13/2013
更新:在 xcode 5 和 iPhone 64 位模拟器之后,我在为另一种架构构建 libPods.a 时出现错误,但在其他类型的模拟器中不会发生:\
13赞 MMiroslav 7/22/2014
@Nour1991尝试设置为Build Settings -> Build Active Architecture OnlyNo
0赞 Pedro Romão 12/18/2014
@MMiroslav我不得不把它说成是,因为我需要在调试中部署。
-2赞 flyers 2/5/2013 #4

我也有一个 armv7s 的架构。我删除了它并确保 armv6 和 armv7 是仅列出的两个。它现在可以工作了

评论

0赞 Maciej Swic 4/2/2014
不应排除 armv7s
28赞 achow 2/6/2013 #5

您正在为与目标不同的架构构建。libnetUtils.a

检查 libnetUtils 构建设置。为其构建的体系结构及其支持的体系结构列表必须是目标体系结构的(弱)超集。这里的复杂性在于,生成的架构分布在各种设置中:“架构”、“仅构建活动架构”和“有效架构”。

“仅构建活动体系结构”设置使这一点特别令人困惑。例如,假设您正在为模拟器进行构建。如果 Debug 的“仅生成活动体系结构”设置设置为 NO,它将生成“体系结构”和“有效体系结构”中列出的所有体系结构(可能是 armv7 等)。但是,如果 libnetUtils 将该设置设置为“是”(调试:是),则它只是为 i386 构建的。因此,当您的链接器尝试将 armv7 与 i386 链接时,它会失败。

26赞 kiranpradeep 5/19/2014 #6

如果我收到忽略文件警告 - 我会在忽略的文件上运行以找到它的架构,如下所示lipo -info

lipo -info libnetUtils.a

这将打印 i386、armv6、armv7、armv7s x86_64等中的任何一个。通常,该体系结构必须与目标生成平台匹配。例如

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

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

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

评论

2赞 Jay Q. 11/19/2014
虽然,这没有回答 OP。这是调试此问题的绝佳工具。我想知道的是,您如何使用上述所有架构构建二进制文件?
0赞 Jay Q. 11/19/2014
没关系,我在这里找到了答案:stackoverflow.com/questions/2793392/...它使用 lipo 使用“-create”标志组合构建
0赞 Shrikant Phadke 4/3/2020
ld:警告:为 iOS-armv7 构建,但尝试与为 iOS-arm64 构建的文件链接 架构 armv7 的未定义符号 此警告会导致 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)此错误。如果您使用的是自己的库/框架,请在项目库和采用者中更改此设置。Build Settings -> Build Active Architecture Only to No
0赞 Shrikant Phadke 4/3/2020
请参考 medium.com/@edisonlo/...
3赞 Eino Gourdin 10/2/2014 #7

遇到了同样的问题,并从页面上尝试了各种解决方案,但无济于事。 我仍然收到一条消息,告诉我我的库不是为 arm64 构建的。

最后我是如何解决的:

  • 在文本编辑器中打开库的 project.pbxproj
  • 搜索VALID_ARCHS
  • 有 4 次出现,其中 2 次不包含 ARM64
  • 我在链中手动添加了 arm64(VALID_ARCHS = “arm64 i386 armv7 armv7s”)
  • 重建库,一切正常

似乎有时 XCode 显示的构建设置不完整,并且与项目文件不完全对应。

42赞 Gajendra K Chauhan 6/8/2015 #8

有时这些类型的错误会激怒您!

删除派生数据对我有用:

修复步骤

1) 在 XCODE > Windows > Project > 选择您的项目 > 删除派生数据 >退出 XCODE 并重新打开它 > 如果出现 MAC-O-Linker 构建失败错误 > 请引用链接> 再次清理并生成。

评论

1赞 Dan Carlson 11/22/2016
有关删除 XCode 8 中的派生数据,请参阅此处:stackoverflow.com/questions/38016143/...
0赞 maerlyn 3/16/2021
对于 XCode 12:programmingwithswift.com/delete-derived-data-xcode
-1赞 Chandni - Systematix 1/24/2017 #9

当我们在设备上运行应用程序时,不会发生此问题。您可以通过在iOS设备上运行代码来检查它。

0赞 JESERRANO 10/20/2018 #10

对我来说,它是固定的设置 to ,为此,您必须扩展它并设置为 和 to。现在,它在我的设备上编译。Build Active Architecture OnlyMultiple valuesDebugYESReleaseNo

4赞 GeRyCh 1/21/2020 #11

您还应该检查“生成设置”中的“部署目标”对于依赖项和依赖项是否相同。我注意到我为静态库目标设置了 iOS 13,而 iOS 10.0 是为使用该库的框架定义的。切换到 10.0 解决了该问题。

评论

0赞 richy 11/26/2020
检查了关于这个问题的所有其他建议,这是让我绊倒的