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

Bad*_*Cat 39 xcode cocoa frameworks compilation swift

我为util/extensions创建了一个Swift框架项目,它将.framework文件编译并复制到我系统上的专用位置.我希望能够将此文件包含在其他项目中(使用库构建阶段/链接二进制文件).框架项目是一个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 Framework项目,它应该自然地与其他Cocoa Touch(即IOS)项目一起工作,不应该吗?

dog*_*god 33

确保您已在lib的Build设置中的Architectures中列出i386x86_64列出.还设置只能建有源体系明确地没有.

  • 构建活动架构只有明确为No对我有用.谢了哥们. (2认同)

小智 10

虽然已接受的答案已经解决了这个问题,但是由于问题是关于体系结构,实际上是二进制文件,所以还有一点

1. iOS中的架构

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

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

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.什么是Build Active Architecture?

如果选择"是",它将仅构建您的框架到"选定设备",实际设备(armv)或模拟器(x86_64或i386).对于"否",它将构建您的框架到"有效架构"列表

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

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

因此,如果您正在使用框架,并且想要导入到另一个项目,那么如果使用模拟器(i386或x86_64)使用Build Active Architecture编译框架"是" ,然后使用仅构建活动体系结构导入到项目中使用真实设备(armv) "是" ,您将遇到此错误.

期待错误描述:

文件是为x86_64构建的,而不是被链接的体系结构(i386)将暗示你在64位模拟器中构建框架,并且你的合并项目使用32位模拟器构建.

而更常见的是:

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

3.提取框架

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

两个不同的文件夹:Debug-iphoneosDebug-iphonesimulator 在此输入图像描述在此输入图像描述


dar*_*nge 8

我遇到了这个问题,当前的解决方案摆脱了原来的错误(即无法链接i386),但随后链接的Frameworks(如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 OnlyYes.这会减慢构建时间,这在经常在不同设备之间切换时会令人沮丧,但这可能是必要的.