我必须建立静态库。我想在我的 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。但没有运气
在努力解决同样的问题并遵循更新构建设置、清除链接器搜索路径等所有公认的答案之后。我终于找到了一个适合我的答案。
在构建之前,请确保选择正确的类型(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 中。本来我没注意文件夹的名字,要不我早就想到了。
希望这可以帮助。
有时这些类型的错误会激怒您!
删除派生数据对我有用:
修复步骤
1) 在 XCODE >窗户>项目>选择您的项目 >删除派生数据 >退出 XCODE 并重新打开它 >如果你得到 MAC-O-Linker builded failed 错误 >参考 this 链接 >再次清理并构建。
您的 libnetUtils.a
是针对与您的目标不同的架构构建的。
检查 libnetUtils 构建设置。它所构建的架构及其支持的架构列表必须是目标架构的(弱)超集。这里的复杂性在于,生成的架构分布在各种设置中:“架构”、“仅构建活动架构”和“有效架构”。
“仅构建活动架构”设置使这特别令人困惑。例如,假设您正在为模拟器构建。如果 Debug 的“Build active architecture only”设置为 NO,它将构建“Architectures”和“Valid architectures”中列出的所有架构(可能是 armv7 等)。但是,如果 libnetUtils 将该设置设置为是(调试:是),则它仅适用于 i386。因此,当您的链接器尝试将 armv7 与 i386 链接时,它会失败。
如果我收到忽略文件警告 - 我会在忽略的文件上运行 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
将打印上述架构的组合。
我实际上不知道我的建议是否正确,但请尝试检查:
选择您的项目
选择“构建设置”
检查架构:有效的架构应该是“armv6 armv7” 支持的平台应该是“iphonesimulator iphoneos”(可能是 iPad,我不知道) Base SDK – 你的 iOS SDK(我有 iOS 5.0)。
有效的架构应该是“armv6 armv7”
支持的平台应该是“iphonesimulator iphoneos”(可能是iPad,我不知道)
Base SDK – 你的 iOS SDK(我有 iOS 5.0)。
如果我是明显的队长,请不要评判我:)
这意味着您尝试使用的库并未针对 iOS 模拟器进行通用编译(i386 符号适用于 Mac)。不过,在实际设备上运行它应该可以正常工作。
您还应该检查构建设置中的部署目标是否与依赖项和依赖项相同。我注意到我为静态库目标设置了 iOS 13,而为使用该库的框架定义了 iOS 10.0。切换到 10.0 解决了这个问题。
有同样的问题,并从页面尝试了多种解决方案,但无济于事。我仍然有一条消息告诉我我的库不是为 arm64 构建的。
最后我是如何解决的:
在文本编辑器中打开库的 project.pbxproj
搜索 VALID_ARCHS
出现 4 次,其中 2 次不包含 arm64
我在链中手动添加了 arm64 (VALID_ARCHS = "arm64 i386 armv7 armv7s")
重建库,一切都好
似乎有时 XCode 显示的构建设置不完整,并且与项目文件不完全对应。
对我来说,将 Build Active Architecture Only
设置为 Multiple values
是固定的,为此,您必须扩展它并将 Debug
设置为 YES
并将 Release
设置为 No
。现在,它可以在我的设备上编译。
当我们在设备上运行应用程序时,不会出现此问题。您可以通过在 iOS 设备上运行代码来检查它。
我也有一个 armv7s 架构。我删除了它并确保 armv6 和 armv7 是唯一列出的两个。现在可以使用
Build Settings -> Build Active Architecture Only
设置为No