在需要时配置XCode 4工作区以构建依赖项的正确方法是什么?

时间:2011-03-25 00:54:39

标签: xcode build xcode4

我的情况很简单,一个包含两个兄弟项目的工作区:一个主(iOS)应用程序和一个构建应用程序使用的几个静态库目标的项目。

以下是我配置构建的方法:

  • 将主应用程序的构建设置中的“用户标题搜索路径”指向库项目位置(通过源树)
  • 在我应用的主要目标编辑器中 - >构建阶段 - > “Link Binary With Libraries”部分,添加了我想要使用的库产品。
  • 在方案中,勾选了“查找隐含依赖关系”

在清理(并删除派生数据)之后,构建在构建主项目期间将此错误告诉我:

ld: library not found for -lChipmunk
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1

果然,如果我查看新创建的派生数据,唯一找到的目标文件是主应用程序,而不是库。 * .o文件的广泛“查找”并未显示任何相关内容,因此库不会丢失,它们肯定不会被构建。

一些补充要点:

  • 当我在Apple开发论坛上询问过这个问题时,有人建议我在主要目标的Build Phases-> Target Dependencies编辑器中添加显式deps。但是,您只能在此处向相同项目或子项目中的目标添加deps;在我的情况下,我将应用程序和库项目作为工作场所的兄弟姐妹。
  • 如果我在主构建之前手动构建每个库,一切都很好。

更新

我刚刚想出了一个解决方法,即将所有deps的目标添加到主应用程序方案的“构建”部分。我之前尝试过这个但没有成功,但没有意识到我可以在列表中拖动目标以获得正确的构建顺序。现在,构建在正确的顺序中发生,无论是在干净之后,还是在库或主应用程序源的更改之后。

我在这里留下问题,因为手动整理构建订单肯定不是必需的。如何设置东西会有问题。

4 个答案:

答案 0 :(得分:41)

编辑方案(交换构建目标,取消/检查“Parallelize Build”和/或“Find Implicit Dependencies”)对我来说不起作用。在静态库中进行任何代码更改后,我仍然需要清理构建项目。在搜索开发论坛时,我终于找到了this answer,它创造了奇迹。

  

确保显示“身份和类型”检查器,然后在应用程序的项目(而不是库)中选择libWhatever.a文件。如果您看到位置:相对于项目[或相对于组],这是您的问题。

     
      
  1. 单击“相对于项目”并将其更改为“相对于构建”   产品
  2.   
  3. 这将改变链接的类型,但它仍然会   被打破。
  4.   
  5. 单击“定位”按钮,找到输出文件。
  6.   

通过 Build Phases 添加静态库到现有项目 - > 链接二进制文件库自动使其成为“相对于组”(如果两者都是同一工作区中的兄弟)。以上述方式更改其位置可解决构建依赖性问题,在项目导航器中,.a文件应以黑色字母(而不是红色)显示。

答案 1 :(得分:8)

我在这里描述了我在工作区中设置多个项目的方式:http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

我同意根据Xcode的文档手动调整方案中的构建目标顺序是不必要的,但这是我迄今为止找到的最佳解决方案。


编辑:我建议尽可能使用https://github.com/CocoaPods/CocoaPods来管理项目依赖关系。

答案 2 :(得分:2)

尝试将库项目拖到主项目中:

library project reference inside main project

答案 3 :(得分:0)

在我的情况下,我可以拥有兄弟配置构建的唯一方法是在我的构建设置中手动添加路径“../MyLibProject/build/Debug-iphoneos”(检查递归以确保) - >图书馆搜索路径。 仅在Main项目中添加.a文件并未阻止链接时出现“lib not found”错误。