ChatGPT解决这个技术问题 Extra ChatGPT

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

我必须建立静态库。我想在我的 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。但没有运气


C
Cody A. Ray

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

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

前:

https://i.stack.imgur.com/YnqsV.png

后:

https://i.stack.imgur.com/p2lnm.png

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

希望这可以帮助。


这为我解决了。有很多方法可以为您不想要的架构构建,未来的搜索者可能希望查看其中的许多答案,看看您是否找到适用于您的答案!
更新:在 xcode 5 和 iPhone 64 位模拟器之后,我在为另一种架构构建 libPods.a 时遇到错误,但在其他类型的模拟器中不会发生:\
@Nour1991 尝试将 Build Settings -> Build Active Architecture Only 设置为 No
@MMiroslav 我不得不说是,因为我需要在调试中部署。
C
Community

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

删除派生数据对我有用:

修复步骤

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


有关在 XCode 8 中删除派生数据,请参见此处:stackoverflow.com/questions/38016143/…
a
achow

您的 libnetUtils.a 是针对与您的目标不同的架构构建的。

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

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


k
kiranpradeep

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


虽然,这并没有回答 OP。这是调试此问题的好工具。我想知道的是,您如何使用上述所有架构构建二进制文件?
没关系,我在这里找到了答案:stackoverflow.com/questions/2793392/… 它使用 lipo 使用“-create”标志来组合构建
ld:警告:为 iOS-armv7 构建但尝试链接为 iOS-arm64 构建的文件 架构 armv7 的未定义符号此警告导致 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)此错误.如果您使用自己的库/框架,请在项目库和采用者中更改它。 Build Settings -> Build Active Architecture Only 改为 No
A
Alexander Bekert

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

选择您的项目

选择“构建设置”

检查架构:有效的架构应该是“armv6 armv7” 支持的平台应该是“iphonesimulator iphoneos”(可能是 iPad,我不知道) Base SDK – 你的 iOS SDK(我有 iOS 5.0)。

有效的架构应该是“armv6 armv7”

支持的平台应该是“iphonesimulator iphoneos”(可能是iPad,我不知道)

Base SDK – 你的 iOS SDK(我有 iOS 5.0)。

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


除了 Alexander 的建议之外,我建议您确保将“仅构建活动架构”设置设置为“否”。这让我最近绊倒了。
C
CodaFi

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


G
GeRyCh

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


检查了关于这个问题的所有其他建议,这是让我绊倒的建议
E
Eino Gourdin

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

最后我是如何解决的:

在文本编辑器中打开库的 project.pbxproj

搜索 VALID_ARCHS

出现 4 次,其中 2 次不包含 arm64

我在链中手动添加了 arm64 (VALID_ARCHS = "arm64 i386 armv7 armv7s")

重建库,一切都好

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


J
JESERRANO

对我来说,将 Build Active Architecture Only 设置为 Multiple values 是固定的,为此,您必须扩展它并将 Debug 设置为 YES 并将 Release 设置为 No。现在,它可以在我的设备上编译。


C
Chandni - Systematix

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


f
flyers

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


你不应该排除 armv7s

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅