【问题标题】:Xcode 6.1: file was built for x86_64 which is not the architecture being linked (i386)Xcode 6.1:文件是为 x86_64 构建的,它不是被链接的架构 (i386)
【发布时间】:2015-01-19 06:44:15
【问题描述】:

我为 util/extensions 创建了一个 Swift 框架项目,它编译并复制一个 .framework 文件到我系统上的一个专用位置。我希望能够将此文件包含到其他项目中(Build Phases/Link Binary with Libraries)。框架项目是 Cocoa Touch Framework 类型的项目(从 Xcode 6.1 项目模板浏览器中选择)。

但是当我尝试编译一个链接框架文件的项目时,我收到了这个警告:

ld:警告:忽略文件 /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils,文件 是为 x86_64 构建的,它不是被链接的架构 (i386): /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils

我可以对框架项目做些什么以使其对其他 iOS 项目有效?这很令人困惑,因为框架项目是一个 Cocoa Touch 框架项目,它自然应该与其他 Cocoa Touch(即 IOS)项目一起使用,不是吗?

【问题讨论】:

    标签: xcode cocoa swift compilation frameworks


    【解决方案1】:

    确保在您的 lib 的 Build 设置中的 Architectures 中列出了 i386x86_64。还将Build Active Architecture Only明确设置为No

    【讨论】:

    • 仅凭这一点似乎还不够。我添加了它们,因此有效架构如下所示:arm64 armv7 armv7s i386 x86_6 ... 仍然出现相同的错误。
    • 好的,我更进一步......我不得不将 Build Active Architecture Only 明确设置为 NO,因为它包含用于调试和发布的混合值。但是警告消失了:在应用程序项目中找不到我的框架 API。看起来框架类没有链接,所以我没有得到框架 API 的自动完成提示,并且编译失败。有什么问题?
    • 你可以有不同的调试和发布设置,可以吗?
    • 仅明确构建活动架构对我没有工作。谢谢老兄。
    【解决方案2】:

    我遇到了这个问题,当前的解决方案摆脱了原来的错误(即无法链接 i386),但是链接的框架(例如 Alamofire)无法导入我的项目。以下解决方案解决了此问题。

    1. 在您的目标Build Settings -> Architectures -> Valid Architectures 中,添加值i386

    1. 接下来,删除项目的派生数据文件夹的内容。该文件夹的内容是在构建期间生成的,可以安全地删除,Xcode 将创建一个新文件夹。要在 Xcode 8 中删除此文件夹,请转到 File->Project/Workspace Settings,单击灰色箭头在 Finder 中打开文件夹位置,然后删除其中的内容。

    2. 清理并重建。

    3. 如果构建仍然失败,请检查问题导航器中是否显示 Update to recommended settings 的内容。单击它,然后重试。
      如果您没有看到该选项,请在构建设置中将 Build Active Architecture Only 更改为 Yes。这会减慢构建时间,当频繁在不同设备之间切换时可能会令人沮丧,但这可能是必要的。

    【讨论】:

    • 它对我有用。我正在使用 Xcode 7.0.1。谢谢!!
    • 有趣的是,我之前手动将其设置为 NO 并且它曾经可以工作。更新到 swift 3,它坏了。恢复为“是”,事情又好了。去图..
    • XCode 8 中的“有效架构”在哪里?
    • @Maiaux 它仍在构建设置中。如果您查看我在此答案中的第一张图片,您会注意到有一个搜索栏。在里面输入validValid Architectures 就会出现。还要确保您选择了All 按钮。如果选择了Basic,它可能不会出现在搜索结果中。
    • @darksinge 我遇到了同样的错误,当我在模拟器中运行代码时,我按照你的步骤操作它对我有用。但是当我尝试在设备中运行代码时出现错误“忽略 fil..,文件是为 x86_64 构建的,它不是被链接的架构(arm64):”然后我对 arm64 执行了相同的步骤,但错误仍然存​​在。
    【解决方案3】:

    我还发现,如果你像我一样通过 cocoapods 使用框架,我必须去 Pods 项目,并为 Pods 项目中的每个框架目标应用 @dogsgod 和 @darksinge 的解决方案。也就是说,我必须只为活动架构关闭构建,并在有效架构中添加 X86_64 和 i386。

    【讨论】:

      【解决方案4】:

      虽然公认的答案已经解决了问题,但这里还有一点,因为问题是关于架构的,实际上是二进制文件

      1. iOS 架构

      armv64:iPhoneX、iPhone 5s-8、iPad Air - iPad Pro

      armv7 : iPhone3Gs-5c, iPad WIFI(第四代)

      armv6 : iPhone - iPhone3G

      以上如果是真实设备

      i386 : 32 位模拟器

      x86_64 : 64 位模拟器

      上面的列表是向下兼容的,也就是说iPhoneX也可以运行armv6,只是不能充分利用armv64的功能

      更多关于 iOS 架构的信息可以在这里找到: https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html

      2。什么是仅构建活动架构?

      如果选择“是”,它只会将您的框架构建到“选定的设备”,无论是真实设备(armv)还是模拟器(x86_64 或 i386)。 对于“否”,它会将您的框架构建到您的“有效架构”列表中

      默认情况下,在调试模式下为“是”;而在release more中则为“No”,这样可以节省debug模式下的编译时间,并保证你的release项目框架运行在你指定的所有架构上。

      这就是为什么通过强制框架为所有架构构建而接受的答案起作用的原因,但是通过阅读更多内容,您将了解背后的内容,并且绝对可以节省编译框架的时间。当然,对自己也有更多的控制权。

      所以,如果您正在开发一个框架,并且想要导入另一个项目,如果您使用 Build Active Architecture Only 编译框架),然后用Build Active Architecture Only“是”用a real device(armv)导入你的项目,你会遇到这个错误。 p>

      查看错误描述:

      文件是为 x86_64 构建的,它不是被链接的架构 (i386) 将意味着您在 64 位模拟器中构建您的框架,而您的合并项目使用 32位模拟器。

      虽然更常见的是:

      框架文件是为 x86_64 构建的,这不是架构 正在链接(arm64): 这意味着您的框架是在模拟器中构建的,而您的合并项目是使用真实设备构建的。

      3.提取框架

      通常的做法是右键单击框架并选择在Finder中显示,而大多数开发人员保持Finder打开,新编译的框架将替换旧框架, 无需关闭 Finder 并再次重新打开。是的,没错,但如果您在两者之间切换构建目标设备,框架将导致不同的文件夹。有时你认为你已经编译了你的框架,但实际上它在另一个文件夹中。我的建议是始终选择在 Finder 中显示,以防止您导入的框架不是最新的。

      两个不同的文件夹:Debug-iphoneosDebug-iphonesimulator

      【讨论】:

      • 老兄!你的第三点3. Extracting the framework 是纯金。当我遇到这个错误时,我差点从椅子上摔下来。但是按照正确提取框架的第三步是正确的方法,接受的答案相当hackish。
      • 原始项目中的框架必须在项目所针对的操作系统级别/设备以及模拟器中编译和构建一次。生成的.framework 文件然后需要从正确的文件夹中选取,如在第三步中导入到新项目中。
      • 谢谢你,我只是在VS2019中用Xamarin.Form开发,对移动开发世界了解不多,就这个问题花了3个小时处理IOS模拟器....Native引用无法在 X86_64 中构建
      【解决方案5】:

      从 React Native 57.8 升级到 58.4 引入了这个链接器问题。虽然不是框架错误。上述方法不起作用,但为我解决的问题是删除 xCode 中的 Test from Targets 部分。不需要它,所以这对我们来说很好。例如,名为 SuperCool 的项目有 TARGETS:SuperCool、SuperCoolTests、SuperCool-tvOS 和 SuperCool-tvOSTests。删除 SuperCoolTests 进行修复。

      【讨论】:

        【解决方案6】:

        由于另一个原因,我遇到了完全相同的错误。 主应用的 iOS 部署版本是 10.0,框架上是 11.0。 由于 11.0 仅允许 64 位,因此该框架仅编译为 64 位。当应用程序想要与 32 位框架链接时,我收到了这个警告:

        file was built for arm64 which is not the architecture being linked (armv7)
        

        随后出现链接器错误,因为缺少框架中的大量符号当然没有找到。

        因此将框架上的部署目标更改为 iOS 10.0 修复了它。将应用程序的部署目标更改为 iOS 11.0 也可能会修复它(仅生成 64 位二进制文​​件)。

        【讨论】:

        • 我在制作构建存档时遇到了同样的错误。我更改了 iOS 部署目标 iOS 11.0。如何在框架上将部署目标更改为 iOS 10.0?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        • 2011-04-11
        相关资源
        最近更新 更多