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

时间:2014-11-17 23:03:43

标签: ios xcode project project-management linker-errors

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

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

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

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

enter image description here

6 个答案:

答案 0 :(得分:13)

这是我对问题的回答摘要删除“DerivedData”后,Xcode不会添加“嵌入式二进制文件”see the original question and answer for more context and information

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

  1. 构建框架。

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

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

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

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

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

答案 4 :(得分:0)

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

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

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

恢复项目&工作区到早期版本没有摆脱伏都教。

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

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

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

答案 5 :(得分:-3)

这可能是因为您的框架是一个单独的项目,而不是一个单独的目标。请在34-36分钟左右仔细观察Session 416: Building a Modern Framework。它将向您展示如何正确设置它。

如果您希望按照

方式跨多个项目共享框架,这会让您感到有点困惑