【问题标题】:The workspace with the iOS project and related a static library projectiOS 项目的工作区和相关的一个静态库项目
【发布时间】:2011-07-20 09:51:08
【问题描述】:

我正在与 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 > Copy Headers > Public;
    • SKIP_INSTALL 设置为YES

重要的是:两个项目的配置必须相同。否则,如果我有,例如,应用程序名为 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 工作区获得任何真正的优势。如果我在应用程序项目中添加静态库项目,我可以添加相同的效果。因此,我认为我的解决方案有问题。 有什么建议如何更好地链接静态库?

【问题讨论】:

  • 看看我的解决方案说明。 stackoverflow.com/questions/6400800/…我通过制作假框架结构解决了这个问题。与您的解决方案 #1 类似的方法,但稍微简单一些。无需修改应用端项目设置。
  • 我不喜欢框架解决方案,因为它有点 hacky,因为它没有得到 Apple 官方对 iOS 的支持。

标签: xcode4 static-libraries header-files


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 看起来是个不错的解决方案。至少我不需要为添加到工作区的每个需要的项目定义源树作为主项目的依赖项。
  • 这个“有效”是因为它可以构建和编译,但是在关闭和打开项目后(这是在 XCode4 中)我失去了代码感导航。
  • 如果您失去了代码意义,尤其是当您在 $(SOURCE_ROOT)/../otherlib 这样的路径中使用“回溯”时,请确保您不使用递归搜索路径。而不是 $(SOURCE_ROOT)/../otherlib/** 添加每个单独的文件夹: $(SOURCE_ROOT)/../otherlib/system $(SOURCE_ROOT)/../otherlib/system/subsystem $(SOURCE_ROOT)/.. /otherlib/system/platform-ios 这并不理想,会创建很长的搜索路径,但它解决了我所有的代码感知问题。
【解决方案3】:

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

发布:

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

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

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

希望它可以帮助人们不要在这上面浪费一天的时间。

【讨论】:

    【解决方案4】:

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

    在您的应用中,您将能够编码#import <YourLib/YourFile.h>

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

    【讨论】:

    • 问题中提到的解决方案 #1 对我有用,但不允许我存档。这个解决方案确实允许我存档
    • 私有头文件不应该被静态库中的公共头文件引用吗?我问,一旦我更改了公共标头文件夹路径,他们就再也找不到私人标头了。
    【解决方案5】:

    这是从 Apple DTS 获得的解决方案。我不喜欢它,因为它建议使用绝对路径。但是我还是在这里发布,也许有人觉得适合他。


    如何设置静态库:

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

    如何设置项目链接到库:

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

    【讨论】:

      【解决方案6】:

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

      这需要派生数据作为您的构建位置。 我将公共标头文件夹路径设置为 ../usr/local/include 这将确保标题不会被放入存档中。

      对于应用程序,我将标题搜索路径设置为: $(OBJROOT)/usr/local/include $(SYMROOT)/usr/local/include

      有 2 个条目是必需的,因为在构建存档时路径会略有变化,我还没有弄清楚如何只用一个变量来描述它。

      这里的好处是,它不会破坏代码意义。因此,除了有 2 个条目而不是 1 个之外,这完全可以正常工作。

      【讨论】:

        【解决方案7】:

        我对所提供的任何其他解决方案都不满意,因此我找到了另一个我更喜欢的解决方案。我不必使用相关路径将 /usr/local/include 文件夹放在安装目录之外,而是在我的方案中的 Archive 步骤中添加了一个预操作。在预操作中,我提供了一个脚本,该脚本在归档之前删除了 usr 目录。

        rm -r "$OBJROOT/ArchiveIntermediates/MyAppName/InstallationBuildProductsLocation/usr"

        这会在归档之前删除 usr 目录,这样它就不会在包中结束并导致 Xcode 认为它有多个模块。

        【讨论】:

        • 我们将静态 lib .a 文件复制到 $(BUILT_PRODUCTS_DIR) 并将它们的包含复制到 $(BUILT_PRODUCTS_DIR)/include/。因此,我将您的命令更改为:rm -fr "${DSTROOT}/include/",它为我解决了问题。 (使用 Xcode 6.3)
        猜你喜欢
        • 2011-07-18
        • 2015-04-17
        • 2012-12-24
        • 1970-01-01
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多