提问人:yarlg 提问时间:5/30/2012 最后编辑:Eino Gourdinyarlg 更新时间:1/21/2020 访问量:76005
文件是为存档而构建的,而不是要链接的体系结构 (i386)
file was built for archive which is not the architecture being linked (i386)
问:
我必须构建静态库。我想在我的 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 模拟器进行通用编译的(i386 符号用于 Mac)。不过,在实际设备上运行它应该可以正常工作。
我实际上不知道我的建议是否正确,但请尝试检查一下:
- 选择您的项目
- 选择“Build Settings”
- 检查架构:
- 有效的体系结构应为“armv6 armv7”
- 支持的平台应该是“iphonesimulator iphoneos”(也许是 iPad,我不知道)
- 基础 SDK – 您的 iOS SDK(我有 iOS 5.0)。
如果我是队长,请不要评判我:)
评论
在与同样的问题作斗争并遵循所有公认的答案(更新生成设置、清除链接器搜索路径等)之后。我终于找到了一个适合我的答案。
在构建之前,请确保选择正确的类型(iPhone 模拟器)而不是 iOS 设备。然后重建。否则,您将尝试在 Mac (i386) 上的模拟器上使用为 iOS 设备(arm 处理器)构建的库。本来应该是显而易见的,但事实并非如此。
以前:
后:
现在,查看“导航器”中的“产品”组>右键单击静态库(.a 文件)>“在 Finder 中显示”,您会注意到它位于 Debug-iphonesimulator 文件夹中,而不是 Debug-iphoneos。我最初没有注意文件夹名称,否则我可能会更早想到这一点。
希望这会有所帮助。
评论
Build Settings -> Build Active Architecture Only
No
我也有一个 armv7s 的架构。我删除了它并确保 armv6 和 armv7 是仅列出的两个。它现在可以工作了
评论
您正在为与目标不同的架构构建。libnetUtils.a
检查 libnetUtils 构建设置。为其构建的体系结构及其支持的体系结构列表必须是目标体系结构的(弱)超集。这里的复杂性在于,生成的架构分布在各种设置中:“架构”、“仅构建活动架构”和“有效架构”。
“仅构建活动体系结构”设置使这一点特别令人困惑。例如,假设您正在为模拟器进行构建。如果 Debug 的“仅生成活动体系结构”设置设置为 NO,它将生成“体系结构”和“有效体系结构”中列出的所有体系结构(可能是 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
评论
遇到了同样的问题,并从页面上尝试了各种解决方案,但无济于事。 我仍然收到一条消息,告诉我我的库不是为 arm64 构建的。
最后我是如何解决的:
- 在文本编辑器中打开库的 project.pbxproj
- 搜索VALID_ARCHS
- 有 4 次出现,其中 2 次不包含 ARM64
- 我在链中手动添加了 arm64(VALID_ARCHS = “arm64 i386 armv7 armv7s”)
- 重建库,一切正常
似乎有时 XCode 显示的构建设置不完整,并且与项目文件不完全对应。
有时这些类型的错误会激怒您!
删除派生数据对我有用:
修复步骤
1) 在 XCODE > Windows > Project > 选择您的项目 > 删除派生数据 >退出 XCODE 并重新打开它 > 如果出现 MAC-O-Linker 构建失败错误 > 请引用此链接> 再次清理并生成。
评论
当我们在设备上运行应用程序时,不会发生此问题。您可以通过在iOS设备上运行代码来检查它。
对我来说,它是固定的设置 to ,为此,您必须扩展它并设置为 和 to。现在,它在我的设备上编译。Build Active Architecture Only
Multiple values
Debug
YES
Release
No
您还应该检查“生成设置”中的“部署目标”对于依赖项和依赖项是否相同。我注意到我为静态库目标设置了 iOS 13,而 iOS 10.0 是为使用该库的框架定义的。切换到 10.0 解决了该问题。
评论