具有iOS项目的工作空间和相关的静态库项目

时间:2011-03-22 11:23:33

标签: xcode4 static-libraries header-files

我正在与Xcode 4工作区作战。目前Xcode 4胜。因此,我的情况:

我有iOS应用程序项目的工作区。 iOS应用程序还依赖于此工作空间中的静态库项目。


解决方案#1

我尝试像这样配置:

  • 应用项目:
    • 添加到目标的构建阶段>链接二进制文件使用库产品(libmystaticlib.a);
    • USER_HEADER_SEARCH_PATHS设为$(TARGET_BUILD_DIR)/usr/local/include $(DSTROOT)/usr/local/include;
  • 静态库项目:
    • 将一些头文件添加到目标的 Build Phases>复制标题>公共;
    • SKIP_INSTALL设为YES

重要的是:两个项目必须具有相同的配置。否则,如果我有例如app的 Distribution(Ad Hoc)配置和静态库的 Release ,则Xcode无法将应用程序与库链接。

使用此配置将结果归档到包含来自静态库项目的应用程序和公共头文件的存档。当然,在这种情况下,我无法分享*.ipa。 :(


解决方案#2

我还尝试了另一种配置:

  • Xcode偏好:
    • 设置静态库的源代码树,例如ADDITIONS_PROJECT;
  • 应用项目:
    • 添加到目标的构建阶段>链接二进制文件使用库产品(libmystaticlib.a);
    • USER_HEADER_SEARCH_PATHS设为$(ADDITIONS_PROJECT)/**;
  • 静态库项目:
    • 不要将任何头文件添加到Public!;
    • SKIP_INSTALL设为YES

我仍然需要关心这两个项目的配置名称。但结果我可以成功构建和存档。在结果中,我获得了存档,我可以分享*.ipa


我不喜欢第二种解决方案,因为在这种情况下,我没有得到Xcode 4工作区的任何真正优势。如果我在app项目中添加静态lib项目,我可以添加相同的效果。因此,我认为我的解决方案有问题。 有什么建议如何更好地链接静态库?

6 个答案:

答案 0 :(得分:10)

我还找到了一个适用于构建和存档的解决方案 在静态库中,将公共标题文件夹路径设置为../../Headers/YourLib
在您的应用配置中,将标题搜索路径设置为$(BUILT_PRODUCTS_DIR)/../../Headers

在您的应用中,您可以对#import <YourLib/YourFile.h>

进行编码

不要忘记静态库中的Skip Install = YES选项。

答案 1 :(得分:2)

我们终于找到了答案。好吧,有点儿。出现此问题是因为Xcode 4在构建存档期间将公共标头放入InstallationBuildProductsLocation文件夹中。显然,归档时,它会看到标题并尝试将它们放入存档中。将公共标题文件夹路径更改为InstallationBuildProductsLocation之外的某个位置,例如,更改为$(DSTROOT)/../ public_folders并将此路径添加到标题搜索路径可解决问题。 这个解决方案看起来不是很优雅,但对我们来说似乎是唯一的选择。可能你会觉得这很有用。

答案 2 :(得分:2)

以下是来自Apple DTS的解决方案。我不喜欢它,因为建议使用绝对路径。但我仍然在这里发表,也许有人觉得这对他来说是对的。


如何设置静态库:

  • 通过复制发布配置添加名为“Archive”的构建配置。
  • 将标题移至“复制标题”构建阶段的“项目”组。
  • 将“Archive”配置的Per-configuration Build Products路径设置为$(BUILD_DIR)/ MyLibBuildDir。 Xcode将在BuildProductsPath中创建MyLibBuildDir文件夹,然后将静态库添加到该文件夹​​中。您可以使用“MyLibBuildDir”或为上述文件夹提供其他名称。
  • 为所有配置设置“跳过安装”为“是”。
  • 将“存档”的安装目录设置为$(TARGET_TEMP_DIR)/ UninstalledProducts。
  • 编辑其方案,将其存档操作的构建配置设置为“存档”。

如何设置链接库的项目:

  • 通过复制发布配置添加名为“Archive”的构建配置。
  • 将“存档”的库搜索路径设置为$(BUILD_DIR)/ MyLibBuildDir。
  • 将用户标题搜索路径设置为所有配置的工作区目录根目录的递归绝对路径。
  • 始终将“存档”的搜索用户路径设置为“是”。
  • 将所有配置的Skip_Install设置为NO。
  • 编辑其方案,将其存档操作的构建配置设置为“存档”。

答案 3 :(得分:1)

到目前为止,我也遇到了同样的问题,但确实找到了一个最小权衡的解决方案:

这需要Dervied Data作为您的构建位置。 我将Public Headers Folder路径设置为../usr/local/include 这将确保标题不会被放入档案中。

对于应用程序,我将标题搜索路径设置为: $(OBJROOT)在/ usr /本地/包括 $(SYMROOT)的/ usr /本地/包括

由于在构建档案时路径略有变化,因此需要2个条目,而我还没有想出如何用一个变量来描述它。

这里的好处是,它不会破坏代码意义。所以除了有两个条目而不是一个,这个工作完全正常。

答案 4 :(得分:0)

此刻我正在努力解决同样的问题。我没有比你进步得更远。我只能在第二个解决方案中添加,您可以将需要使用的标题从库中拖动到应用程序项目,而不是设置ADDITIONS_PROJECT和USER_HEADER_SEARCH_PATH。这将使它们在app项目中可见。在这种情况下,SKIP_INSTALL标志的值无关紧要。 尽管如此,这个解决方案并不适合我,因为我正在移动相当大的项目,有几十个库,从Xcode 3到Xcode 4,这意味着我的项目构建和存档正确。如果您找到更好的方法,请告诉我们。

答案 5 :(得分:0)

我可以使用Core Plot作为静态库和工作区兄弟,有两个构建配置:

推出:

  • 在项目中,标题搜索路径:“$(BUILT_PRODUCTS_DIR)”
  • 在CorePlot-CocoaTouch中,公共标题文件夹路径:/ usr / local / include

AdHoc(在Scheme中为“存档”步骤构建配置,生成可共享的.ipa):

  • 在项目中,标题搜索路径:“$(BUILT_PRODUCTS_DIR)”/../../ public_folders / **
  • 在CorePlot-CocoaTouch中,公共标题文件夹路径:../../ public_folders

希望它能帮助别人不浪费一天。