2014-11-21 113 views
32

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

但是当我尝试编译哪个环节框架文件的项目,我得到这样的警告:

LD:警告:忽略文件 /用户/用户名/项目/ Xcode中/利布斯/ swiftutils。框架/ swiftutils,文件 是专为x86_64的是不被连接的架构 (I386): /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils

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

回答

26

请确保您的架构中列出了i386x86_64在您的库的构建设置中。还设置了仅建立主动架构

+0

这本身似乎并不足够。我已经添加了它们,以便有效体系结构读取像这样:arm64 armv7 armv7s i386 x86_6 ...仍然出现相同的错误。 – BadmintonCat 2014-11-21 07:33:44

+0

好吧,我更进一步......我必须明确地将Build Active Architecture设置为NO,因为它包含用于调试和发布的混合值。但是警告消失了:我的框架API在应用程序项目中找不到。它看起来像框架类没有链接,所以我没有得到框架API的自动完成提示,编译失败。什么可能是错的? – BadmintonCat 2014-11-21 08:04:24

+0

您可以为调试和发布设置不同的设置,是不是? – dogsgod 2014-11-23 08:52:11

6

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

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

build settings

  • 接着,删除项目的导出的数据文件夹的内容。这个文件夹的内容是在编译期间生成的,可以安全地删除,Xcode将创建一个新的文件夹。要在Xcode 8中删除此文件夹,请转至File - >Project/Workspace Settings,单击灰色箭头在Finder中打开文件夹位置,然后删除内容。 derived data folder location

  • 清洁和重建。

  • 如果构建仍然失败,请检查问题导航器中是否有Update to recommended settings。点击它并再试一次。
    如果您没有看到该选项,请在构建设置中将Build Active Architecture Only更改为Yes。这会减慢构建时间,这在频繁切换不同设备时可能令人沮丧,但可能有必要。

  • +1

    它为我工作。我正在使用Xcode 7.0.1。谢谢!! – lgm 2016-09-11 02:59:54

    +1

    有趣的是,我以前手动设置为NO,它曾经工作。更新到迅速3,它打破了。恢复到YES,事情又好了。去图.. – joe 2016-11-22 23:58:19

    +0

    XCode 8中的“有效架构”在哪里? – Maiaux 2016-12-21 15:09:20

    1

    我还发现,如果你是通过使用的CocoaPods作为框架,我是,我不得不去荚项目,并申请通过@dogsgod和@darksinge解决方案在豆荚项目中的每个框架的目标。也就是说,我必须关闭构建活动体系结构,并在有效的体系结构中添加X86_64和i386。

    0

    虽然接受的答案已经解决了这个问题,这里是多一点,因为这些问题是关于建筑,从字面上二进制文件

    1的iOS建筑

    armv64:iPhoneX ,iPhone 5S-8,iPad的空气 - iPad的临

    的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.什么是构建主动架构?

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

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

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

    因此,如果您正在使用的框架,并要导入到另一个项目,如果你有只建“是”与模拟器(I386或x86_64),然后导入编译框架有源体系与您的项目建立有源架构只有“是”与真实设备(armv),您将遇到此错误。

    展望错误描述:

    文件是为x86_64的内置这是不被连接的架构(I386)将意味着你建立在64位模拟器的框架,您的合并项目用32位模拟器构建。

    而更常见的是:

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

    3.提取框架

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

    两个不同的文件夹:调试-的iPhoneOS调试,iphonesimulator enter image description hereenter image description here

    相关问题