Xcode 4和嵌套项目 - 找不到头文件

时间:2011-03-24 00:30:03

标签: cocoa frameworks xcode4

我遇到了Xcode 4和嵌套项目的无数问题,这些问题在Xcode 3.2下运行良好。这是一个我无法解决的基本问题:

我正在构建一个cocoa框架,需要另一个cocoa框架,我有源代码。所以我执行通常的步骤:

  • 将所需框架的.xcodeproj文件拖到我的主框架项目
  • 在TARGETS>下的主框架中MyFramework>构建阶段> 目标依赖关系:添加嵌套项目的目标
  • 确保嵌套框架的头文件是公开的
  • 在Xcode设置>地点> 构建位置我将其设置为将构建产品放置在派生数据位置(推荐)
  • 两个目标的
  • 构建产品路径设置为${BUILT_PRODUCTS_DIR}并告诉我他们位于 DerivedData / Debug (或Release)位置
  • 两个目标的架构设置相同

然后我点击[CMD] + B进行构建,它告诉我它没有找到嵌套框架的头文件。当我检查设置时,用户标题搜索路径包含 DerivedData / Debug 的路径,里面有嵌套的框架目标,其中包含 Versions /中的头文件A /接头

我坐在这里,任何人都知道我做错了什么?


当我将用户标题搜索路径更改为${BUILT_PRODUCTS_DIR}/MyFramework.framework/Headers时构建调试时,问题就消失了。但是,当构建分发时,这不起作用,因为框架然后使用他们的发布设置,最终在不同的子目录...


我的临时解决方案是为嵌套项目定义分发配置。这样就可以找到标题,链接器也可以成功链接。

8 个答案:

答案 0 :(得分:53)

到目前为止,这是我的综合知识:

使用Xcode忘记整个公共标题,它是一个PITA,在归档你的应用时无法正常工作。相反,请将所有静态库头文件放在项目级别,并告诉您的应用在哪里找到它。

  1. 通过确保所有目标都具有相同的构建配置名称来缓解您的痛苦(即向静态库添加“AdHoc”和“部署”配置)。

  2. 在构建设置中,指向标题搜索路径(如果您使用#include <file.h>)或用户标题搜索路径(如果您使用{{ 1}})到静态库项目的目录。如果静态库项目在您的应用程序目录,请使用:

    #include "file.h"(已启用递归

    如果您的目录包含a)静态库项目和b)您的应用程序,那么这应该有效:

    "$(PROJECT_DIR)"(已启用递归

  3. 如果子模块包含已编译的库,请将库搜索路径设置为:

    "$(PROJECT_DIR)/.."

  4. 确保您使用的所有静态库项目都跳过安装设置为"$(TARGET_BUILD_DIR)"

  5. 再次,没有公共头文件(构建阶段»复制标题)在任何静态库中,否则Xcode将无法存档应用程序。

  6. 确保告诉Xcode何时构建静态库,如in this Tech Doc from Apple所示。


  7. 旧答案:

    我还没有找到静态库的这个问题的真正解决方案。对我有用的是:

    • 为静态库创建“AdHoc”配置
    • YES添加到应用的用户标题搜索路径(选中递归) - &gt;这在运行应用程序时使用
    • 在Xcode菜单中,选择产品&gt; 构建&gt; 构建存档

    这很有效,应用程序找到头文件并自行构建,最终在DerivedData // Build / Products / AdHoc-iphoneos /作为应用程序包。在TestFlightApp.com的these simple instructions(死链接)之后,我可以将此应用程序打包到IPA中并发送它。只需选择存档来自Xcode的应用程序再次找不到标题,即使它们确实位于AdHoc-iphoneos构建目录中。

答案 1 :(得分:3)

(从Xcode 5.1开始)

当子项目由XCode构建时,子项目头文件将复制到构建目录中。归档时,似乎此复制目标目录未添加到标头/包含搜索路径。您需要转到构建设置并添加

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include

到您用于存档的方案的“标题搜索路径”。

如果您不确定哪个方案用于存档,请转到产品 - &gt;方案 - &gt;编辑方案并在左栏中查找存档。

答案 2 :(得分:2)

确保您的第三方框架作为«group»添加到您的主项目中,以便您可以在项目的层次结构中看到它...

答案 3 :(得分:1)

我在这里遇到了同样的问题,我可以通过设置“构建位置”将构建产品放置在目标指定的位置来解决问题“

答案 4 :(得分:1)

我遇到了这个问题:我可以构建Debug和App Store配置,但不能构建Ad Hoc。构建Ad Hoc给了我错误,因为它无法找到嵌套项目所需的.h文件。

原来我的Release配置中有一个过期的配置延迟。我更新了配置链接,现在我可以构建Ad Hoc并使用存档功能将其打包

花了我几个小时才搞清楚!我的想法只是没有从丢失的.h文件跳转到配置错误本身。 =)可能有一个错误或警告抱怨缺少配置,但如果是这样,它很好地埋没在数百个.h相关错误中。

答案 5 :(得分:1)

我遇到了与名为“Ad Hoc”的配置相同的问题(根据http://help.testflightapp.com/customer/portal/articles/402782-how-to-create-an-ipa-xcode-4处的TestFlight建议),主项目无法从嵌套项目中找到一些标题。我将项目重命名为“AdHoc”(没有空格),问题就消失了;在某些情况下,似乎空格可能会破坏标题搜索路径,尽管我还没有弄清楚何时可能发生的具体情况以及原因。

答案 6 :(得分:1)

我遇到了一个构建静态库的嵌套项目的问题。我在苹果网站上发现了这个文件,完全挽救了我的生命。

http://developer.apple.com/library/ios/#DOCUMENTATION/Xcode/Conceptual/ios_development_workflow/AA-Developing_a_Static_Library_and_Incorporating_It_in_Your_Application/archiving_an_application_that_uses_a_static_library.html

我很高兴我不必使用派生数据路径。

答案 7 :(得分:0)

对我来说,这发生在GIT合并之后,它产生了许多冲突,其中一个与项目文件有关。合并后,我确定项目文件的结构发生了变化。

我最终做的是进入“构建设置”项目,然后查找“始终搜索用户路径”并将其转换为Yes

我想合并将此布尔值转换为No,因此项目没有找到头文件的正确位置。