it-swarm.dev

无法在XCode中将嵌入式二进制文件(其他项目)添加到项目依赖项中

我有一个使用XCode 6.0.1创建的XCode工作区。它拥有2个(Swift)库和一个依赖于这2个库的iOS应用程序(Swift)。我有稳定的设置,允许我在iPhone和模拟器上运行iOS应用程序:2个库项目被添加为 嵌入式二进制文件 (见图片)的应用程序。

现在,我有XCode 6.1。最近,我在XCode运行时删除了~/Library/Developer/Xcode文件夹中的DerivedData文件夹。之后我的工作区不起作用 - iOS应用程序将无法编译,我收到链接器错误,说它无法找到库项目。

我尝试通过从 嵌入式二进制文件 应用程序项目中移除我的2个库来解决它 - 我无法将它们添加回去。单击 嵌入式二进制文件 项目设置中的+按钮可正确显示工作区项目,但选择和添加我的库项目不会将它们添加到 嵌入式二进制文件 列表中。我通过创建新工作区解决了链接器错误。该应用程序编译但它如何链接库对我来说是一个谜:它们没有列出 嵌入式二进制文件 链接的框架和库 不在 框架搜索路径 。应用程序和它需要的库之间似乎没有任何关联(显然有编译时),除了库项目在同一个工作区。

为什么我不能将库项目添加到 嵌入式二进制文件 ?在XCode 6.1中,依赖项目是否正常编译并嵌入到应用程序中而不在任何地方列出或链接是否正常?

enter image description here

17
Rasto

这是我对问题的回答的总结Xcode在删除“DerivedData”之后不会添加“嵌入式二进制文件”, 请参阅原始问题和答案以获取更多上下文和信息

  1. 从工作区中删除所有框架项目
  2. 执行“clean build”和/或删除“DerivedData”
  3. 将项目添加回工作区
  4. 构建项目(可能是可选的)
  5. 在应用目标的常规选项卡中,单击_下面的“链接的框架和库”,选择框架。
  6. 在模拟器中构建和运行(应该没有问题构建或运行)
  7. 构建并运行设备(由于框架未正确链接,可能会导致崩溃,忽略此崩溃)
  8. 单击+下的“嵌入式二进制文件”,选择框架。这应该将它添加到项目中(在“链接的框架和库”下可能重复)
  9. 重复所有必需的框架
  10. 确认构建和运行(在设备上)后,您可以删除Project Navigator中的任何重复(和/或红色)框架或目标General选项卡
13
rjstelling

好的,我遇到了和你一样的问题。删除派生数据后,我无法再次重新链接我的二进制文件。我认为原因是因为派生数据是二进制文件在项目中写入和链接的位置。

我要解决的是选择我的框架作为我的构建目标。构建它之后,Framework目标从红色变为黑色。我在你的截图中看到它是红色的,这意味着它没有被编译成二进制文件并写在磁盘上。

一旦我这样做,我就能够将Framework重新链接到我的Project,因为它在磁盘上有一个引用。希望这可以帮助!

5
Hobbes the Tige

以下是我解决问题的方法:

  1. 建立框架。

  2. 打开构建文件夹并将构建的框架拖到应用程序项目中(因此它使用DerivedData的路径)。

  3. 将框架添加到嵌入式框架列表中。

  4. 在Finder中,在应用程序的xcodeproj文件上显示内容,然后在您喜欢的文本编辑器中打开project.pbxproj。

  5. 找到具有长DerivedData路径的行。更改它以便没有名称,路径是框架名称,源树是BUILT_PRODUCTS_DIR

Xcode应该注意到更改,应用程序项目中的库将是黑色而不是红色,现在将构建并正常运行。

1
Mark Lilback

清理您的项目并首先构建您的框架。此后你可以嵌入它。

1
NumeroUno

我有一个非常类似的问题,并在昨晚修复它。决定回到这个主题并提供我的解决方法,因为上面的rjstelling解决方案对我的情况没有帮助。

我有一个包含两个框架和一个应用程序的工作区。应用程序正在愉快地使用这两个框架,直到我遇到一个神秘的编译错误,它决定添加一个属性访问一个名为“cube”的实例变量,该类变量在一个框架中找到,类访问“_cube”不可能(抱怨它没有被声明,虽然它以前在setter方法中实际上有效)。

长话短说,干净后,工作区/应用程序项目不知何故丢失了我的iOS 8+项目的嵌入式框架。删除嵌入式框架是该失败线中的最后一根,导致我的项目不再允许选择任何嵌入框架。

将项目和工作空间恢复到早期版本并没有摆脱伏都教。

我最终在主应用程序项目中添加了要嵌入的框架项目(作为文件),并在框架上引入了目标依赖项。

然后我能够重新嵌入框架和链接。

至于_cube,我必须为属性指定一个getter,并将该属性@synthesize为另一个名称。我对这个没有解释。

0
Martin-Gilles Lavoie