如何在框架中使用Swift文件中的C dylib
我正在寻找开始在框架中使用Swift,它使用libz.dylib
,但看起来没有办法从Swift中导入它。 我尝试import zlib
并import libz
,但这不起作用。 ZLib已经与目标相关联。
似乎让我的Swift代码看到zlib
类的唯一方法是在桥接头中导入必要的头文件,但是框架目标不能有桥接头,那么有没有办法使用dylib?
我添加了一个C / C ++ dylib库,带有C Public API头到Swift Project。
假设库是libModule.dylib。
-
使用“模块”创建目录
mkdir Module; cd Module
-
在Module目录中创建一个文件module.map
Touch module.map
-
创建一个目录,这将是头文件目录,任何名称都将服务。
mkdir Headers
-
将所有标头复制到Headers目录中
cp -R path/Headers Headers/
-
Swift团队建议,在库名称前添加前缀C,万一它是一个C库,打开module.map并将内容复制到它下面。
module CModule { umbrella "Headers" // for multiple files header "filename.h" // for single header file, in this case even the Header directory is not needed. export * }
-
转到构建设置 – > Swift编译器 – 搜索路径
- 将完整的模块目录路径添加到“导入路径”键。
- 转到构建阶段,添加新的复制文件阶段。
- 将libModule.dylib拖到“复制文件”阶段。 选择“框架”的目标。
- 如果需要,将libModule.dylib添加到Build Phases的Link Binary With Libraries部分。
如果错过了第9步,我们就会发现着名的@ rpath / Image未发现崩溃。
现在在swift中导入模块如下:
import CModule // name given inside module.map
对于系统库,大多数步骤不需要..只需创建具有正确标题路径的目录和模块映射文件并执行6,7。它似乎步骤10甚至不需要作为它的系统库。
module CommonCrypto [system] { header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h" export * }
您可以按照以下答案中的描述导入系统模块: 在Swift框架中导入CommonCrypto
TLDR
- 将名为
ZLib
的文件夹添加到框架目录中 - 添加具有以下内容的
module.map
文件
module ZLib [system] { header "/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/zlib.h" export * }
您可能必须更改zlib标头的路径 。 该示例适用于XCode 7 Beta和El Capitan。
- 将当前生成的module.map文件添加到构建设置中
- 在swift文件中导入ZLib,您就可以开始了