【问题标题】:Static Library public headers are not copied to Build/Products folder静态库公共标头不会复制到 Build/Products 文件夹
【发布时间】:2014-03-10 18:53:56
【问题描述】:

我有 2 个项目,每个项目构建一个静态库,以及另一个使用两个静态库的项目。

两个静态库之一构建良好。另一个没有,原因是 在自定义 shell 脚本运行之前,它的公共标头没有复制到构建文件夹

这里是发生了什么的演示:

SampleA(有效的)

Compile MyClass1.cpp ...
Compile MyClass2.cpp ...
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Create universal binary libSampleA.a ...
Copy SampleA.h ...in /Users/user/....
Copy MyClass1.h ...in /Users/user/....
Copy MyClass2.h ...in /Users/user/....
Run custom shell script 'Prepare Framework'
Stripping libSampleA.a 
--- Build complete

SampleB(不起作用的那个)

Compile OtherClass1.cpp ...
Compile OtherClass2.cpp ...
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Libtool /Users/user/Library/Developer/XCode/DerivedData/.....
Create universal binary libSampleB.a ...
// >>>>> NO HEADER FILES ARE COPIED <<<<<<
Run custom shell script 'Prepare Framework'
--- Build fails (header folder does not exist) 

我当前的设置是一个包含所有 3 个项目的工作区,但我曾经有一个项目,每个静态库也有一个嵌套项目。我遇到的问题在两种设置中都一样。

更多信息

  • 我几乎已经尝试了我在网上找到的所有说明、提示和建议来完成这项工作。
  • 据我所知,这两个项目的设置是相同的。比较两个项目文件不是很有效。我也没有一一比较这两个项目的所有设置,以确保它们是相同的(目前)。
  • 调试和存档版本中的问题相同(我知道存档的行为不同)
  • 我已添加"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include" 和/或"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"
  • 我已将标头添加到 “构建阶段 > 复制标头 > 公共” 部分 - 无效
  • 按照 Apple 的建议,我已经完全删除了 “构建阶段 > 复制标头” 阶段,并将标头添加到 复制文件 阶段 - 没有用李>
  • 我在静态库项目中添加了一个新组并添加了所有标头,没有将目标设置为 “添加到目标” - 不起作用
  • 我已经退出 XCode 并再次尝试,甚至重新启动了 mac - 没用

两个库之间的一个区别是 SampleB(未构建的库)包含来自 SampleA 的各种标头。没有编译器或链接器错误,只是我描述的构建结束时的错误。

来源

我用于创建库以及尝试解决问题的一些资源:

那么,您知道在构建过程中是什么触发了标头被复制或不被复制吗?

我怀疑即使将一个头文件添加到 Copy Headers 阶段或 Copy Files 阶段,至少应该复制这个。但事实证明,情况并非如此,至少在我的情况下是这样。

【问题讨论】:

  • 您应该遵循的唯一链接是来自 Apple 的官方链接。其他链接中的其他建议要么已过时,要么错误。

标签: ios xcode xcode5 static-libraries archiving


【解决方案1】:

在我的设置中,我有一个带有嵌套项目的父项目,它发出一个静态库。

我尝试了 Headers 阶段,存档时无法让 Xcode 将标题复制到正确的位置。加上标题和静态库被复制到存档中,这是您不想要的。所以我最终使用 Copy Files 阶段并将 Skip Install 设置为 YES,同时将父项目中的 Header Search Paths 指向 BUILT_PRODUCTS_DIR。

【讨论】:

    【解决方案2】:

    按照 Apple 的说明,从模板中创建一个 CocoaTouch 静态库项目:

    确保您已将自定义“运行脚本”阶段放置在“复制文件”阶段之后:

    然后,在构建时,成绩单将如下所示:

    【讨论】:

    • 由于我已经尝试过Apple的方法(但不是在一个空白项目上),我不得不承认我在阅读您的回复时非常怀疑。事实证明,只需按照 Apple 的说明创建一个新项目,给了我一个可行的解决方案,而且不到 5 分钟!所以,非常感谢您的帮助!有时简单的解决方案效果最好;)
    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2020-05-10
    • 2011-07-29
    相关资源
    最近更新 更多