如何在框架中使用Swift文件中的C dylib

我正在寻找开始在框架中使用Swift,它使用libz.dylib ,但看起来没有办法从Swift中导入它。 我尝试import zlibimport libz ,但这不起作用。 ZLib已经与目标相关联。

似乎让我的Swift代码看到zlib类的唯一方法是在桥接头中导入必要的头文件,但是框架目标不能有桥接头,那么有没有办法使用dylib?

我添加了一个C / C ++ dylib库,带有C Public API头到Swift Project。

假设库是libModule.dylib。

  1. 使用“模块”创建目录

     mkdir Module; cd Module 
  2. 在Module目录中创建一个文件module.map

     Touch module.map 
  3. 创建一个目录,这将是头文件目录,任何名称都将服务。

     mkdir Headers 
  4. 将所有标头复制到Headers目录中

     cp -R path/Headers Headers/ 
  5. 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 * } 
  6. 转到构建设置 – > Swift编译器 – 搜索路径

  7. 将完整的模块目录路径添加到“导入路径”键。
  8. 转到构建阶段,添加新的复制文件阶段。
  9. 将libModule.dylib拖到“复制文件”阶段。 选择“框架”的目标。
  10. 如果需要,将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

  1. 将名为ZLib的文件夹添加到框架目录中
  2. 添加具有以下内容的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。

  1. 将当前生成的module.map文件添加到构建设置中
  2. 在swift文件中导入ZLib,您就可以开始了