如何从带有嵌套头文件的 C 库创建框架
How to create a framework from a C library with nested headers
我想为流行的 C 库创建一个 iOS 框架。
我当前的设置:
这就是我正在做的事情:
- 为 iOS 和 iPhone 模拟器架构构建库
- 使用
lipo
将两个存档 .a
文件合并到一个 fat 库中
- 使用
libtool -static -o
得到最终的库
到这个阶段我有一个二进制文件和一堆头文件。在 xcode:
删除二进制文件(来自第 3 步)并确保其链接在:Target > General > Framework and Libraries
和 Target > Build Phases > Link Binary with Libraries
我把C库中的头文件全部拷贝过来,放在目录Dependencies/myClibrary/include/
下。 include
目录包含一个主头文件 myClibrary.h
,其中包含来自 ./abstract/*.h
.
的许多头文件
在 xcode 项目目录的顶层,我还创建了一个 module.map
文件,内容为:
module MyWrapperFramework [system] {
header "Dependencies/myClibrary/include/myClibrary.h"
export *
}
将所有头文件添加到 xcode,对于每个头文件,在 Target Membership
下将值从 project
更改为 public
。
建造
在应用程序中测试框架
我能够使用上述设置构建框架。但是,当我想在测试 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 但保留结构,如果有很多子目录)。
我想为流行的 C 库创建一个 iOS 框架。
我当前的设置:
这就是我正在做的事情:
- 为 iOS 和 iPhone 模拟器架构构建库
- 使用
lipo
将两个存档 - 使用
libtool -static -o
得到最终的库
.a
文件合并到一个 fat 库中
到这个阶段我有一个二进制文件和一堆头文件。在 xcode:
删除二进制文件(来自第 3 步)并确保其链接在:
Target > General > Framework and Libraries
和Target > Build Phases > Link Binary with Libraries
我把C库中的头文件全部拷贝过来,放在目录
的许多头文件Dependencies/myClibrary/include/
下。include
目录包含一个主头文件myClibrary.h
,其中包含来自./abstract/*.h
.在 xcode 项目目录的顶层,我还创建了一个
module.map
文件,内容为:
module MyWrapperFramework [system] {
header "Dependencies/myClibrary/include/myClibrary.h"
export *
}
将所有头文件添加到 xcode,对于每个头文件,在
Target Membership
下将值从project
更改为public
。建造
在应用程序中测试框架
我能够使用上述设置构建框架。但是,当我想在测试 Objective C 应用程序中对其进行测试时,我导入框架并调用与 myClibrary
相关的函数。在构建应用程序时,出现错误:
'myClibrary/abstract/headername.h' file not found
以上错误源于myClibrary
的主头文件myClibrary
.
我能找到的大部分教程都涉及具有单个头文件的 C 库。如何从包含嵌套头文件的 C 库创建 iOS 框架?
如果嵌套头文件不是这里的主要问题,我做错了什么?
框架的 headers 安装在 .framework 内的 Headers 目录中。编译器知道足够的魔法,当你说#import
因此,默认的 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 但保留结构,如果有很多子目录)。