Xcode 6.1:文件是为x86_64构建的,而不是被链接的架构(i386)

时间:2014-11-21 07:11:33

标签: xcode cocoa swift compilation frameworks

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

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

  

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

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

6 个答案:

答案 0 :(得分:32)

确保您的lib的Buildures中的Architectures中列出了i386x86_64。同时将仅建立活动架构明确设置为

答案 1 :(得分:8)

我遇到了这个问题并且当前的解决方案摆脱了原始错误(即无法链接i386),但随后链接的Frameworks(例如Alamofire)无法导入到我的项目中。以下解决方案解决了这个问题。

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

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

    2. 清理并重建。

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

答案 2 :(得分:8)

虽然已接受的答案已经解决了问题,但这里有一点问题,因为问题是关于架构,字面意思是二进制文件

<强> 1。 iOS中的架构

  

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

     

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

     

armv6:iPhone - iPhone3G

     

以上if if real devices

     

i386:32位模拟器

     

x86_64:64位模拟器

以上列表向下兼容,这意味着iPhoneX也可以与armv6一起运行,而且无法充分利用armv64的功能

有关iOS架构的更多信息,请访问: https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html

<强> 2。什么是Build Active Architecture?

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

默认情况下,在调试模式下,它为“是”;在更多版本中,它是“否”,它可以节省调试模式下的编译时间,并确保您的发布项目框架在您指定的所有体系结构上运行。

这就是为什么通过强制框架为所有体系结构构建所接受的答案,但是通过阅读更多,您将知道背后的内容并且绝对可以节省编译框架的时间。当然,对自己也有更多的控制。

因此,如果您正在开发一个框架,并希望导入到另一个项目,那么使用模拟器(i386或x86_64)使用仅构建活动体系结构“是”编译框架),然后使用构建活动架构“是”导入您的项目一个真实设备(armv),您将遇到此错误。

查看错误说明:

  

文件是为 x86_64 构建的,而不是链接的体系结构( i386 )意味着您在64位模拟器中构建框架,并且您的合并项目构建为32位模拟器。

虽然更常见的是:

  

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

第3。提取框架

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

两个不同的文件夹: Debug-iphoneos Debug-iphonesimulator enter image description here enter image description here

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

由于另一个原因,我有这个完全相同的错误。 主应用程序的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位二进制文​​件)。