Xcode 4无法从静态库依赖关系找到公共头文件

备用标题来帮助搜索

  • Xcode无法找到标题
  • 在Xcode中缺少.h
  • 找不到Xcode .h文件
  • 词法或预处理器问题文件未找到
  • 我正在开发一个来自Xcode 3的iOS应用程序项目。现在我已经转移到了Xcode 4,我的项目构建了一些静态库。

    那些静态库也声明公共头文件,这些头文件被应用程序代码使用。 在Xcode 3.x中,头部被复制(作为构建阶段)到public headers directory ,然后在应用程序项目中public headers directory被添加到headers search list

    在Xcode 4下,构建目录被移动到~/Library/Developer/Xcode/DerivedData/my-project

    问题是我如何在标题搜索设置中引用这个新位置? 看起来:

  • public headers directoryDerivedData目录相关,但是
  • headers search目录是相对于别的东西(可能是项目位置)
  • 我应该如何在Xcode 4中为iOS开发设置一个静态库目标,以确保在试图编译为依赖时,头文件可供使用静态库的客户端使用?


    我对这个问题看到的每种解决方案都显得不够优雅(将头文件复制到应用程序的项目中),或者过分简化为只能在微不足道的情况下工作。

    简短的答案

    将以下路径添加到您的用户标题搜索路径

    “$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts”

    为什么这个工作?

    首先,我们需要了解问题。 在正常情况下,即运行,测试,配置文件或分析时,Xcode会构建您的项目并将输出放入Build / Products / Configuration / Products目录中,该目录可通过$ BUILT_PRODUCTS_DIR宏获得。

    有关静态库的大多数指南建议将Public Headers文件夹路径设置为$ TARGET_NAME ,这意味着您的lib文件变为$ BUILT_PRODUCTS_DIR /libTargetName.a,并且您的头文件将放入$ BUILT_PRODUCTS_DIR / TargetName中。 只要您的应用程序在搜索路径中包含$ BUILT_PRODUCTS_DIR ,那么导入就可以在上述4种情况下运行。 但是,当您尝试归档时,这不起作用。

    存档工作有点不同

    归档项目时,Xcode使用名为ArchiveIntermediates的不同文件夹。 在该文件夹中,您会找到/ YourAppName / BuildProductsPath / Release-iphoneos /。 这是您执行归档时$ BUILT_PRODUCTS_DIR指向的文件夹。 如果你看看那里,你会发现你的内置静态库文件有一个符号链接,但是缺少包含头文件的文件夹。

    要找到标题(和lib文件),您需要转到IntermediateBuildFilesPath / UninstalledProducts /。 还记得当你被告知为静态库设置跳过安装为YES吗? 那么当你创建一个存档时,这是设置的效果。

    注意:如果你没有将它设置为跳过安装,你的头文件将被放到另一个位置,lib文件将被复制到你的压缩文件中,从而阻止你导出一个可以提交给App Store的.ipa文件。

    经过大量搜索之后,我找不到任何与UninstalledProducts文件夹完全对应的宏,因此需要使用“$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts”构建路径

    概要

    对于您的静态库,请确保您跳过安装,并且您的公共头文件被放置在$ TARGET_NAME中。

    对于您的应用程序,请将用户标题搜索路径设置为“$(BUILT_PRODUCTS_DIR)”(适用于常规构建),而“$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts”适用于存档构建。


    在开发自己的静态库时遇到了同样的问题,虽然Colin的回答非常有帮助,但我不得不对其进行修改,以便在Xcode 4下使用Workspace运行和归档项目时一致地工作。

    我的方法有什么不同之处在于您可以为所有构建配置使用单个用户头部路径。

    我的方法如下:

    创建一个工作区

  • 在Xcode 4下,转到文件,新建,工作区。
  • 在Finder中,您可以将.xcodeproj项目拖放到要使用的静态库以及使用该库的正在构建的新应用程序中。 有关设置工作区的更多信息,请参阅Apple文档:https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html
  • 静态库项目设置

  • 确保所有静态库的头文件都设置为复制到“Public”。 这是在静态库目标>构建阶段的设置下完成的。 在“复制标题”阶段,确保所有标题都在“公开”部分。
  • 接下来转到Build Settings,找到“Public Headers Folder Path”并为您的图书馆输入一个路径。 我选择使用这个:
  • 包括/库名称

    我从RestKit的使用中采纳了这一点,并发现它对我所有的静态库最有效。 这是告诉Xcode将我们移动到第1步中的“公共”标题部分的所有标题复制到我们在此处指定的文件夹,该文件夹位于构建时的Derived Data文件夹中。 与RestKit一样,我喜欢使用单个“包含”文件夹来包含我在项目中使用的每个静态库。

    我也不喜欢在这里使用宏,因为它可以让我们稍后在使用静态库配置项目时使用单个用户头部搜索路径。

  • 找到“跳过安装”并确保它设置为YES。
  • 使用静态库的项目设置

  • 将Build Phases> Link Binary With Libraries下的静态库添加为框架,然后为要使用的任何静态库添加libLibraryName.a文件。
  • 接下来确保项目设置为搜索用户搜索路径。 这是在“生成设置”>“始终搜索用户路径”下完成的,并确保将其设置为“是”。
  • 在相同的区域找到用户标题搜索路径并添加:

    “$(PROJECT_TEMP_DIR)/../ UninstalledProducts /包括”

  • 这告诉Xcode在构建过程中在Xcode创建的中间构建文件夹中查找静态库。 在这里,我们有我们用于静态库位置的“包含”文件夹,我们在步骤2中为静态库项目设置进行设置。 这是让Xcode正确找到你的静态库的最重要的一步。

    配置工作区

    在这里,我们要配置工作区,以便在构建应用程序时构建静态库。 这是通过编辑用于我们的应用程序的方案完成的。

  • 确保你选择了将会创建你的应用程序的方案。
  • 从方案下拉列表中选择编辑方案。
  • 选择左侧列表顶部的Build。 按中间窗格上的+添加新目标。
  • 你应该看到静态库显示你试图链接的库。 选择iOS静态库。
  • 点击运行和存档。 这会告诉方案在您构建应用程序时为静态库编译库。
  • 将静态库拖到应用程序目标上方。 这使得静态库在应用程序目标之前编译。
  • 开始使用库

    现在,您应该可以使用导入静态库

    import <LibraryName/LibraryName.h>
    

    这种方法避免了为不同的配置设置不同的用户头文件路径的麻烦,所以编译归档文件时应该没有问题。

    为什么这个工作?

    这一切都取决于这条道路:

    "$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"
    

    由于我们将静态库配置为使用“跳过安装”,因此编译后的文件将移至临时构建目录中的“UninstalledProjects”文件夹。 我们的路径也解析为我们为静态库设置的“include”文件夹,并用于我们的用户头搜索路径。 两者合作让Xcode在编译过程中知道在哪里找到我们的库。 由于Debug和Release配置都存在此临时构建目录,因此您只需Xcode的单个路径即可搜索静态库。


    Xcode 4 Project无法编译静态库

    相关问题:Xcode 4中的“词法或预处理器问题文件未找到”

    错误可能包括; 缺少头文件,“词法或预处理器问题”

    解决方案:

  • 检查“用户头文件路径”是否正确
  • 将“始终搜索用户路径”设置为YES
  • 在您的项目中创建一个组标题“索引标题”,并将标题拖动到该组中,不要在提示时添加到任何目标。
  • 链接地址: http://www.djcxy.com/p/22699.html

    上一篇: Xcode 4 can't locate public header files from static library dependency

    下一篇: Difference between static and shared libraries?