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

2023-12-23

我正在考虑开始在框架中使用 Swift,该框架使用libz.dylib,但似乎无法从 Swift 中导入它。我试过import zlib and import libz,这不起作用。 ZLib 已链接到目标。

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


我已向 Swift 项目添加了一个 C/C++ dylib 库,其中包含 C 公共 API 标头。

假设该库是 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. 打开 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 拖至 Copy Files 阶段。选择“框架”作为目标。
  10. 如果需要,将 libModule.dylib 添加到构建阶段的“链接二进制文件与库”部分。

如果错过第 9 步,我们会遇到著名的 @rpath/ Image not found 崩溃。

现在在 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 *
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐