Swift iOS模块没有被部署到预期的debugging目录

我有一个用Swift编写的模块/框架,打算在iOS上使用。 当我尝试在我的应用程序中包含框架时,我首先在构build阶段注意到一些红色的“未find”提示:

在这里输入图像说明

但是,项目build立良好 – find目标依赖关系,所以没有编译问题。 这只是由此产生的构build框架 – 当然,启动时,我有一个链接器错误,它无法find图像。 看看构build日志,这是看这里:

/Users/Craig/Projects/Fluffy/build/Debug-iphoneos/ 

这是有道理的 – 这是我的框架的构build设置中定义的:

在这里输入图像说明

但是复制失败,因为源框架不存在:

 PBXCp /Users/Craig/projects/Fluffy/build/Debug-iphoneos/Fluffy_iOS.framework /Users/Craig/Library/Developer/Xcode/DerivedData/MyApp-dcjfhcnyzkwzxiejuuxqlsgajreb/Build/Products/Debug-iphoneos/MyApp/Frameworks/Fluffy_iOS.framework ... error: /Users/Craig/projects/Fluffy/build/Debug-iphoneos/Fluffy_iOS.framework: No such file or directory 

然而,看看我的框架的构build日志,我看到它实际上在这里结束:

 /Users/Craig/Library/Developer/Xcode/DerivedData/Fluffy-fuuewsvogdkycegheyrsabkiicxc/Build/Products/Debug-iphonesimulator/Fluffy_iOS.framework 

我想这是有道理的 – DerivedData已经有一段时间了,是任何构build产品的默认位置。

而当我看看预期的 build文件夹时,并没有太多的东西,很多都是旧的,并没有涉及到Debugconfiguration:

在这里输入图像说明

所以我的问题是:为什么我的框架被放置在DerivedData文件夹,当它似乎要求在生成设置放置在相对于该项目的生成文件夹? 这些参数(每个configuration的构build产品path等)都参考了吗?

而且,我该怎么做才能调和呢? 我的应用程序如何知道为框架查找正确的DerivedData文件夹,以正确的configuration(debugging与发布),以一种可扩展的方式,并将工作,而不必手动指定它的绝对path?

好的,所以我想出了如何解决这个问题。 这假定你有工作空间,并且你已经把这个框架作为一个项目包含在工作空间中,并且你正试图从包含这个框架的工作空间中的另一个项目中构build一个产品。

你需要做的是找出构build框架的位置。 这通常是DeriveData目录下的DeriveData疯狂的目录。 findFinder并find您刚刚尝试构build的configuration。

在产品目标的General设置中,在Embedded Binaries ,将该文件拖入其中。 这现在应该把它放在Project Navigator 。 您还应该在Embedded Binaries下面的Linked Frameworks and Libraries看到它。

转到Project Navigator并select文件并在File Inspector下查看它。 在那里,将Location更改为Relative to Build Products

在目标的“ Build Settings ,对于“ Framework Search Paths ,添加$(BUILT_PRODUCTS_DIR)并进行recursion。 删除添加框架时自动添加的条目。 这将是一个明确的path,其中有DerivedDatapath。

深入清理并删除DerivedData目录以获得更好的效果。

build立。

你现在应该看到框架变黑,它应该正常工作。

除了上面的模拟器上完美的答案。 在设备上,你会得到dyld库没有find错误和崩溃。

这是解决scheme:

在依赖于该框架的项目中:在构build设置下:添加一个副本文件阶段,并将该框架添加到复制文件阶段的“框架”文件夹中。

这些是由@Mobile Ben提供的稍微修改的步骤

假设您有以下Xcode项目结构

 -YourWorkspace --YourFramework project --YourApp project 

步骤1.使用Cmd+Shift+KCmd+Option+Shift+K清除所有目标(通过在Schemeselect器中select每个目标并按热键组合)

步骤2.selectYourFramework项目。

步骤3.select一个模拟器并构build( Cmd+BYourFramework框架目标

第4步:selectGeneric iOS Device并构build( Cmd+BYourFramework框架目标

第5步:selectYourApp项目。 在Embedded Binaries+ ,然后selectYourFramework项目下的框架

第6步:现在在Project Navigator(左边)find刚添加的框架。 在File Inspector(在右侧)selectRelative to build product位置Relative to build product

注意:我相信步骤6是Xcode中的一些错误所需的B / C。 但是,不selectRelative to build product默认Relative to build product可能是一个故意的行为

UPD#1:由于Xcode 8.0(8A218a),不再需要第6步 – IDE会自动设置“ Relative to Build Products