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+K
和Cmd+Option+Shift+K
清除所有目标(通过在Schemeselect器中select每个目标并按热键组合)
步骤2.selectYourFramework
项目。
步骤3.select一个模拟器并构build( Cmd+B
) YourFramework
框架目标
第4步:selectGeneric iOS Device
并构build( Cmd+B
) YourFramework
框架目标
第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
。