【问题标题】:Xcode error: file was built for archive which is not the architecture being linked (x86_64)Xcode 错误:文件是为存档而构建的,它不是被链接的架构 (x86_64)
【发布时间】:2014-10-24 18:14:32
【问题描述】:

我有一个 iOS Xcode 项目,可以在模拟器和设备中构建和运行良好。但是,我有一个新功能需要使用静态库(仅针对 ARM 架构构建)——这意味着它可以在设备上构建并运行良好,但对于模拟器我会收到此错误——

ld: warning: ignoring file libXYZ.a, file was built for archive which is not the architecture being linked (x86_64): libXYZ.a

Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_XYXClass", referenced from: objc-class-ref in MyAppClass.o

我了解这个问题,但我仍然希望能够在模拟器中构建和运行应用程序(可能通过在模拟器中排除或禁用需要静态库的新功能)。

我已经尝试了以下项目设置,以便应用程序也可以为模拟器构建 -

  1. 将“架构”设置为 $(ARCHS_STANDARD_INCLUDING_64_BIT)
  2. 将“仅构建活动架构”设置为否

没有任何效果。有什么想法可以为模拟器构建吗?谢谢!

【问题讨论】:

    标签: ios xcode ios-simulator static-linking


    【解决方案1】:

    最简单的解决方案可能只是使用英特尔切片(针对 iOS 模拟器 SDK)和 arm 切片构建静态存档,这样它是 4-way fat(i386+x86_64/iOS Simualtor 和 armv7/arm64/iOS )。

    如果这不可行,请解释为什么这对您来说是不可能的,并在http://bugreport.apple.com 提交雷达,以便我们可以解决阻碍您构建静态存档的任何问题。

    如果您想在 iOS 模拟器构建中不使用静态存档继续进行,则需要避免在模拟器中使用 XYXClass。你可以这样做:

    #include <TargetConditionals.h>
    #if TARGET_IPHONE_SIMULATOR
        // Do sim-specific fallbacks
    #else
        // Do stuff with XYXClass
    #endif
    

    请注意,“警告:忽略文件 libXYZ.a ...”消息不是致命的。这只是一个您可以忽略的警告。致命的部分是您使用了在 x86_64 中没有实现的 XYXClass。

    【讨论】:

    • 谢谢! if/else 效果很好。静态存档由第三方供应商提供,我无法控制它。
    • 啊,有道理。您应该要求该第三方提供其库的副本,该库也可以在 iOS 模拟器中运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多