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


79

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

ld:警告:忽略文件/Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a,该文件是为不是链接架构的归档文件而构建的(i386)架构i386的未定义符号:
“ _ OBJC_CLASS _ $ _ netUtils”,引用自:ViewController.o中的objc-class-ref ld:未发现体系结构i386铛的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)

我尝试在体系结构中添加i386。但没有运气

Answers:


77

经历了同样的问题并遵循了所有可接受的更新构建设置,清除链接程序搜索路径等答案之后,我终于找到了一个对我有用的答案。

在构建之前,请确保选择正确的类型(iPhone模拟器)而不是iOS设备。然后重建。否则,您尝试在Mac(i386)上的模拟器上使用为iOS设备(ARM处理器)构建的库。应该是显而易见的,但事实并非如此。

之前:

iOS设备设置

后:

iPhone 5.1模拟器设置

现在,在导航器的“产品”组中查找>右键单击您的静态库(.a文件)>在Finder中显示,您会注意到它位于Debug-iphonesimulator文件夹中,而不是Debug-iphoneos。我最初并没有对文件夹名称进行任何关注,否则我可能会早些想到这一点。

希望这可以帮助。


这为我解决了。有许多方法可用于您不打算使用的体系结构,将来的搜索者可能希望仔细研究这些答案中的许多内容,以了解您是否找到了适合您的一种!
Danny

更新:Xcode的5和iPhone的64位模拟器后,我有libPods.a错误正在建造另外的建筑,但它并没有在其他类型的模拟器发生:\
Nour1991

13
@ Nour1991尝试设置Build Settings -> Build Active Architecture OnlyNo
MMiroslav

@MMiroslav我不得不说是,因为我需要在调试中进行部署。
PedroRomão2014年


28

libnetUtils.a所构建的体系结构与目标体系不同。

检查libnetUtils构建设置。要为其构建的体系结构及其支持的体系结构列表必须是目标体系结构的(弱)超集。这里的复杂之处在于,生成的体系结构分布在各种设置上:“体系结构”,“仅构建活动体系结构”和“有效体系结构”。

“仅构建活动的体系结构”设置使这一点特别令人困惑。例如,假设您正在构建模拟器。如果将“调试”的“仅构建活动体系结构”设置设置为“否”,它将构建“体系结构”和“有效体系结构”中列出的所有体系结构(可能是armv7等)。但是,如果libnetUtils将该设置设置为“是”(调试:是),则仅针对i386构建。因此,当您的链接器尝试将armv7与i386链接时,它将失败。


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将打印上述架构的组合。


2
虽然,这没有回答OP。这是调试此问题的好工具。我想知道的是,如何使用上述所有架构构建二进制文件?
杰伊·Q。

没关系,我在这里找到了答案:stackoverflow.com/questions/2793392/…它使用lipo通过'-create'标志组合构建
Jay Q.

ld:警告:为iOS-armv7构建,但尝试与为iOS-arm64构建的文件链接未定义体系结构armv7的符号,此警告将导致clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)此错误。如果您使用自己的库/框架,则在项目库和采用者中都进行更改。Build Settings-> Build Active Architecture Only to No
Shrikant Phadke'Apri 3'20


9

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

  • 选择你的项目
  • 选择“构建设置”
  • 检查架构:
    • 有效的架构应为“ armv6 armv7”
    • 支持的平台应该是“ iphonesimulator iphoneos”(也许是iPad,我不知道)
    • 基本SDK –您的iOS SDK(我有iOS 5.0)。

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


17
除了Alexander的建议外,我还建议您确保将“仅Build Active Architecture”设置设置为“ NO”。这最近使我绊倒了。
TPoschel

5

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


3

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

最后,我如何解决它:

  • 在文本编辑器中打开了库的project.pbxproj
  • 搜索VALID_ARCHS
  • 有4次出现,其中2次不包含arm64
  • 我在链中手动添加了arm64(VA​​LID_ARCHS =“ arm64 i386 armv7 armv7s”)
  • 重建库,没关系

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


3

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


检查了有关此问题的所有其他建议,这就是让我绊倒的建议
富裕

0

对我来说,它是固定设置Build Active Architecture OnlyMultiple values,要做到这一点,你必须把它和一组扩展DebugYESReleaseNo。现在,它可以在我的设备上编译。


-1

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


-2

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


您不应该排除armv7s
Maciej Swic 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.