我要构建静态库。我想在我的iPhone和ipad应用程序中使用。当我尝试运行模拟器时,我得到链接错误。我是iOS开发的新手。善意的帮助;
ld:警告:忽略文件 /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a,file 是为存档而构建的,而不是链接的体系结构 (i386)架构i386的未定义符号:
“_OBJC_CLASS _ $ _ netUtils”,引自: ViewController.o中的objc-class-ref ld:找不到架构i386 clang的符号:错误:链接器命令失败,退出代码为1 (使用-v查看调用)
我尝试在架构中添加i386。但没有运气
答案 0 :(得分:71)
在努力解决同样的问题并遵循更新构建设置,清除链接器搜索路径等所有已接受的答案后,我终于发现了一个对我有用的答案。
在构建之前,请确保选择正确的类型(iPhone模拟器)而不是iOS设备。然后重建。否则,您正试图在Mac(i386)上的模拟器上使用为iOS设备(arm处理器)构建的库。应该是显而易见的,但事实并非如此。
<强>之前:强>
<强>后:强>
现在,查看导航器中的Products组&gt;右键单击您的静态库(.a文件)&gt;在Finder中显示,你会发现它在Debug-iphonesimulator文件夹而不是Debug-iphoneos中。我最初没有注意文件夹名称,或者我可能早就想到了这个。
希望这有帮助。
答案 1 :(得分:41)
有时这些类型的错误会刺激你!
为我删除派生数据:
修复步骤
1)在XCODE中> Windows&gt;项目&gt;选择你的项目&gt;删除派生数据&gt;退出XCODE并重新打开它&gt;如果你得到MAC-O-Linker builed failed错误&gt;参考this链接&gt;再次清洁和建造。
答案 2 :(得分:27)
您的libnetUtils.a
是针对与目标不同的架构而构建的。
检查libnetUtils构建设置。它正在构建的体系结构及其支持的体系结构列表必须是目标体系结构的(弱)超集。这里的复杂性是生成的体系结构分布在各种设置上:“体系结构”,“仅构建活动体系结构”和“有效体系结构”。
“仅构建活动架构”设置使这一点特别令人困惑。例如,假设您正在为模拟器构建。如果将Debug的“Build active architecture only”设置设置为NO,它将构建“架构”和“有效架构”(可能是armv7等)中列出的所有架构。但是,如果libnetUtils将该设置设置为Yes(Debug:Yes),则它仅适用于i386。因此,当您的链接器尝试将armv7与i386链接时,它会失败。
答案 3 :(得分:22)
如果我收到忽略文件警告 - 我会在忽略的文件上运行lipo -info
以找到它的架构,如下所示
lipo -info libnetUtils.a
那将打印i386,armv6,armv7,armv7s,x86_64等。通常,该架构必须与您的目标构建平台相匹配。 E.g。
根据不匹配情况,您必须为目标平台重建库或更改目标平台。
注意:对于胖二进制文件,lipo -info
将打印上述体系结构的组合。
答案 4 :(得分:9)
我实际上并不知道我的建议是否正确,但请尝试检查:
如果我明显是队长,请不要评判我。)
答案 5 :(得分:5)
这意味着您尝试使用的库不是为iOS模拟器普遍编译的(i386符号适用于Mac)。在实际设备上运行它应该可以正常工作。
答案 6 :(得分:3)
有同样的问题,并尝试从页面的各种解决方案无济于事。 我还有一条消息告诉我我的库不是为arm64构建的。
最后我如何解决它:
有时,XCode显示的构建设置有时不完整,并且与项目文件并不完全对应。
答案 7 :(得分:3)
您还应该检查“构建设置”中的“部署目标”是否与依赖项和依赖项相同。我注意到我为静态库目标设置了iOS 13,而为使用该库的框架定义了iOS 10.0。将两者都切换为10.0可解决此问题。
答案 8 :(得分:0)
当我们在设备上运行应用程序时,不会发生此问题。您可以通过在iOS设备上运行代码来检查它。
答案 9 :(得分:0)
对我来说,将Build Active Architecture Only
设置为Multiple values
是固定的,为此,您必须将其展开并将Debug
设置为YES
和Release
到No
。现在,它可以在我的设备上编译。
答案 10 :(得分:-2)
我也有armv7s的架构。我删除它并确保armv6和armv7是列出的唯一两个。它现在有效