2015-07-03 59 views
2

我正在寻找开始在框架中使用Swift的框架,该框架使用libz.dylib,但它看起来像无法从Swift中导入它。我试过import zlibimport libz,这没有奏效。 ZLib已经链接到目标。如何在框架中使用Swift文件中的C dylib

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

+0

@rmaddy我包括Objective-C的标签作为一种变通的解决方案可能涉及的Objective-C – Dov

回答

1

您可以导入系统模块,在这个答案说明:Importing CommonCrypto in a Swift framework

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。

  • 当前生成module.map文件添加到您的构建设置
  • 导入的ZLib在迅速文件,你就可以去
  • +0

    谢谢 - 这似乎更像是一个解决方法不是解决方案,但 – Dov

    +1

    同意它应该是更容易整合的模块,但它解决了许多其他问题:http://clang.llvm.org/docs/Modules.html#problems-with-the-current-model – bobbyR

    2

    我已经加入一个C/C++ dylib库,带有C公共API头文件到Swift Project。

    假设库是libModule.dylib。

    1. 与 “模块” 创建目录

      mkdir Module; cd Module 
      
    2. 创建模块目录

      Touch module.map 
      
    3. 中的文件module.map创建一个目录,这将是头文件目录,任何名字都会有效。

      mkdir Headers 
      
    4. 拷贝所有的标题为头目录

      cp -R path/Headers Headers/ 
      
    5. 开放module.map &复制下面的内容吧,斯威夫特团队建议,添加前缀下,在库名称的前面,在情况下,如果其一个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. 转到构建设置 - >雨燕编译器 - 搜索路径

    7. 添加完整的模块目录路径“导入路径”键。
    8. 转到构建阶段,添加新的复制文件阶段。
    9. 将libModule.dylib拖到Copy Files阶段。选择目标为“框架”。
    10. 如果需要,请将libModule.dylib添加到“构建阶段的链接二进制库”部分。

    如果第9步错过了,我们会发现着名的@ rpath/Image未找到崩溃。在迅速如下

    立即导入模块:

    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 * 
        } 
    
    +0

    创建Headers目录也是可选的,在这种情况下,“Headers”伞变成了“伞”。 “但是将所有标题复制到根目录是我不会考虑的。 – RK1979

    相关问题