【问题标题】:Why is a static library's header file not found for archiving?为什么找不到用于归档的静态库的头文件?
【发布时间】:2012-11-28 07:59:18
【问题描述】:

我可以为调试而构建。我已经三重检查了静态库是否包含在项目的构建阶段设置中。我也尝试过其他的东西,比如标题包含路径等等都无济于事。

当我尝试为试飞构建 IPA 时,出现错误: #import <MBProgressHUD/MBProgressHUD.h>

我之前能够构建 IPA,但它之前没有实现/使用 MBProgressHUD 静态库。

我可以手动包含头文件和代码文件,而不是静态链接它,但我更愿意知道这里发生了什么。

谢谢。

PS - 我使用了https://github.com/jdg/MBProgressHUD 给出的“静态库”指令

【问题讨论】:

    标签: ios xcode compiler-errors mbprogresshud


    【解决方案1】:

    默认情况下,Xcode 将构建产品放入$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME),例如,这相当于build/Release-iphoneos。这是产品内置的文件夹,也是标题将被复制到的文件夹。

    当我们将 Release 配置复制为一个名为“App Store”的配置时,Xcode 现在构建到 build/App Store-iphoneos。实际上,问题在于静态库仍在使用它们的 Release 配置构建到 Release 构建文件夹中。

    因为 App Store 配置(至少对我而言)只能在配置文件之间轻松切换,所以我的解决方案是将 App Store 配置的“按配置构建产品路径”更改为 $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME),以便App Store 配置也构建到 Release 构建文件夹中。

    【讨论】:

    • 这救了我的培根!应将其标记为正确答案,因为以上都没有像宣传的那样起作用。
    • 谢谢@DanielBang。
    【解决方案2】:

    借助另一个 SO 问题 (https://stackoverflow.com/a/10159481/143225),我能够将头文件包含在内。

    显然,存档构建过程与调试构建过程有所不同。通过将"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts" 添加到“用户标头搜索路径”构建设置,它构建成功。

    我仍然想了解为什么它没有按我的预期工作。我有一种预感,该项目被构建为自动包含用于调试和发布版本的头文件,但不知何故不适用于存档版本。这很奇怪,因为我认为归档构建继承自 Xcode 方案设置的调试或发布设置。

    欢迎提供任何其他信息。

    【讨论】:

    • 这个解决方案似乎非常适合我的情况。查找用于构建但不用于归档的头文件。但是添加到我的标题搜索路径并没有解决它。无赖!现在我必须继续寻找。
    • 备注:这几乎对我有用。我必须附加 /<Library or ProjectName>/<Public Headers Export Path> 才能让它工作!同样重要的是:不要使用“”!导入时必须带有“”。
    • 这也几乎对我有用,但我必须在该路径的末尾添加“/include/”(所以,"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include/")。然后 Xcode 终于能够在归档时使用 #import "LibraryName/Header.h" 的形式找到我的静态库的头文件。
    • 在 Xcode 8.0 中,我必须将 iphoneos 添加到路径:$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/iphoneos/includes
    • @Udo 请改用TARGET_BUILD_DIR
    【解决方案3】:

    Daniel Tull 的回答会起作用,但您可以更新静态库项目配置以包含“App Store”配置或您的应用目标正在构建的任何其他命名配置,而不是更改“按配置构建产品路径”反对,这是发布配置的副本。这样,静态库将把它的库和头文件/包含文件输出到适当的目录,这将由“Per-configuration Build Products Path”中使用的 $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 宏解析';和 walllaaaaa...公共库头文件现在可以由 Xcode 正确解析。总而言之,如果您的应用程序目标中有一个名为“App Store”的配置,并且链接到一个导出标头的静态库,请确保静态库项目还包含“App Store”配置,您将成为其中的一个快乐的露营者。

    【讨论】:

    • 真的非常感谢您为我们团队的自动化部署保驾护航!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2021-08-26
    • 2012-08-24
    • 2021-06-07
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多