79

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

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

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

4

11 回答 11

77

在努力解决同样的问题并遵循更新构建设置、清除链接器搜索路径等所有公认的答案之后。我终于找到了一个适合我的答案。

在构建之前,请确保选择正确的类型(iPhone 模拟器)而不是 iOS 设备。然后重建。否则,您将尝试在您的 mac (i386) 上的模拟器上使用为 iOS 设备(arm 处理器)构建的库。应该很明显,但不是。

前:

iOS 设备设置

后:

iPhone 5.1 模拟器设置

现在,查看 Navigator 中的 Products 组 > 右键单击​​您的静态库(.a 文件)> 在 Finder 中显示,您会注意到它位于 Debug-iphonesimulator 文件夹中,而不是 Debug-iphoneos 中。本来我没注意文件夹的名字,要不我早就想到了。

希望这可以帮助。

于 2013-01-03T17:11:24.723 回答
42

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

删除派生数据对我有用:

修复步骤

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

于 2015-06-08T05:36:40.593 回答
28

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

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

“仅构建活动架构”设置使这特别令人困惑。例如,假设您正在为模拟器构建。如果 Debug 的“Build active architecture only”设置为 NO,它将构建“Architectures”和“Valid architectures”中列出的所有架构(可能是 armv7 等)。但是,如果 libnetUtils 将该设置设置为是(调试:是),则它仅适用于 i386。因此,当您的链接器尝试将 armv7 与 i386 链接时,它会失败。

于 2013-02-06T01:28:57.837 回答
26

如果我收到忽略文件警告 - 我会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将打印上述架构的组合。

于 2014-05-19T06:22:00.113 回答
9

I don't actually know if my advice is correct, but try checking this:

  • Select your project
  • Select "Build Settings"
  • Check Architectures:
    • Valid architectures should be "armv6 armv7"
    • Supported platforms should be "iphonesimulator iphoneos" (maybe iPad, I don't know)
    • Base SDK – your iOS SDK (I have iOS 5.0).

Do not judge me if I am captain obvious :)

于 2012-05-29T16:50:26.210 回答
5

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

于 2012-05-29T16:37:17.390 回答
4

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

于 2020-01-21T07:28:16.773 回答
3

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

最后我是如何解决的:

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

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

于 2014-10-02T14:41:19.390 回答
0

Build Active Architecture Only对我来说,将to设置为固定的Multiple values,要做到这一点,您必须将其扩展并设置DebugYESand Releaseto No。现在,它可以在我的设备上编译。

于 2018-10-19T20:34:33.543 回答
-1

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

于 2017-01-24T15:38:53.537 回答
-2

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

于 2013-02-05T15:32:37.633 回答