我想为一个流行的C库创建一个iOS框架。
我目前的设置:
这就是我正在做的:
- 为 iOS 和 iPhone 模拟器架构构建库
- 使用
lipo
将两个存档.a
文件合并到一个胖库中 - 使用
libtool -static -o
获取最终库
在这个阶段,我有一个二进制文件和一堆头文件。在 xcode 中:
-
删除二进制文件(从步骤 3 开始(并确保其链接在:
Target > General > Framework and Libraries
和Target > Build Phases > Link Binary with Libraries
下 -
我从 C 库中复制所有头文件并将它们放在目录
Dependencies/myClibrary/include/
下。include
dir 包含一个主头文件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 框架?
如果嵌套头文件不是这里的主要问题,我做错了什么?
框架的标头安装在 .framework 内的 Headers 目录中。 编译器知道足够的魔力,当你说 #import 时,它将开始在该标头目录中搜索myClibrary.h。
因此,默认的公共标头构建规则是将所有公共 .h 文件(无论它们在源代码树中的位置如何(复制到该标头目录中。 在构建过程中,该目录应设置为 $PUBLIC_HEADERS_FOLDER_PATH 变量。
似乎您需要将标头安装到不同的目录中。 只需将生成设置中的公共标头文件夹路径的值设置为子目录,然后该子目录将在那里安装所有公共标头。 然后,您可以有一个自定义的"复制文件"生成阶段,以仅将单个整体标头安装到原始标头目录中。
或者,您可以只添加作为公共标头进入根目录的标头,然后对所有其余部分进行自定义复制文件阶段,将它们复制到自定义子目录中。 我认为如果您选择"包装器"作为目的地,那就是框架的根,因此如果子路径是"标头/抽象",则应工作(尽管我尚未测试自己(。 如果需要有多个子目录,则需要为每个子目录进行自定义"复制文件"生成阶段。
或者,当然,有一个自定义构建脚本来更手动地复制标头,如果这比多个构建阶段更容易(例如,如果有很多子目录,则将包含目录中的所有文件复制到 $PUBLIC_HEADERS_FOLDER_PATH 但保留结构(。