如何从带有嵌套头文件的 C 库创建框架

How to create a framework from a C library with nested headers

我想为流行的 C 库创建一个 iOS 框架。

我当前的设置:

这就是我正在做的事情:

  1. 为 iOS 和 iPhone 模拟器架构构建库
  2. 使用 lipo
  3. 将两个存档 .a 文件合并到一个 fat 库中
  4. 使用libtool -static -o得到最终的库

到这个阶段我有一个二进制文件和一堆头文件。在 xcode:

  1. 删除二进制文件(来自第 3 步)并确保其链接在:Target > General > Framework and LibrariesTarget > Build Phases > Link Binary with Libraries

  2. 我把C库中的头文件全部拷贝过来,放在目录Dependencies/myClibrary/include/下。 include 目录包含一个主头文件 myClibrary.h,其中包含来自 ./abstract/*.h.

    的许多头文件
  3. 在 xcode 项目目录的顶层,我还创建了一个 module.map 文件,内容为:

module MyWrapperFramework [system] {
  header "Dependencies/myClibrary/include/myClibrary.h"
  export *
}
  1. 将所有头文件添加到 xcode,对于每个头文件,在 Target Membership 下将值从 project 更改为 public

  2. 建造

在应用程序中测试框架

我能够使用上述设置构建框架。但是,当我想在测试 Objective C 应用程序中对其进行测试时,我导入框架并调用与 myClibrary 相关的函数。在构建应用程序时,出现错误:

'myClibrary/abstract/headername.h' file not found

以上错误源于myClibrary的主头文件myClibrary.

我能找到的大部分教程都涉及具有单个头文件的 C 库。如何从包含嵌套头文件的 C 库创建 iOS 框架?

如果嵌套头文件不是这里的主要问题,我做错了什么?

框架的 headers 安装在 .framework 内的 Headers 目录中。编译器知道足够的魔法,当你说#import 时,它会开始在 Headers 目录中搜索 myClibrary.h。

因此,默认的 public header 构建规则是将所有 public .h 文件(无论它们在源代码树中的位置如何)复制到 Headers 目录。该目录应在构建期间设置为 $PUBLIC_HEADERS_FOLDER_PATH 变量。

您似乎需要将 headers 安装到不同的目录中。您可以简单地将构建设置中的 Public Headers 文件夹路径的值设置为一个子目录,然后它将在那里安装所有 public header。然后,您可以有一个自定义复制文件构建阶段,只将单个整体 header 安装到原始 headers 目录中。

或者,您可以只添加 headers,它们作为 public headers 进入根目录,然后为所有其余部分创建自定义复制文件阶段,这将它们复制到自定义子目录中。我想如果你选择“Wrapper”作为目标,那是框架的根,所以如果子路径是“Headers/abstract”应该可以工作(虽然我自己没有测试过)。如果您需要有多个子目录,则每个子目录都需要一个自定义复制文件构建阶段。

或者,当然,如果这比多个构建阶段更容易(比如将 include 目录中的所有文件复制到 $PUBLIC_HEADERS_FOLDER_PATH 但保留结构,如果有很多子目录)。