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

时间:2015-07-03 05:19:33

标签: c xcode swift dylib

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

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

2 个答案:

答案 0 :(得分:3)

我添加了一个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. 将所有标题复制到标题目录

    cp -R path/Headers Headers/
    
  5. 打开module.map&将下面的内容复制到它,Swift团队建议,在库名前添加前缀C,以防它是一个C库。

    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部分。
  11. 如果错过了第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 *
        }
    

答案 1 :(得分:1)

您可以按照以下答案中所述导入系统模块:Importing CommonCrypto in a Swift framework

<强> TLDR

  1. 将名为ZLib的文件夹添加到框架目录
  2. 添加包含以下内容的module.map文件
  3. 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,您就可以开始了