Swift中使用C库



  • swift 中使用 c 或 c++ 我们平常做法是用oc包一层然后再去用swift调用,这种做法能满足我们的需求,但是某天我突然想到 我可以使用纯swift去实现吗?
    答案是可以的,不少serve side swift 库 都是用到了c库,毕竟老大哥 稳定 高效!

    let's do it

    主要是需要使用 spm 。spm 不多介绍 可以找下官方文档试用下。
    我们这里自己做一个协程库,能够让swift调用。这里用到了 libdill

    mkdir clibdill
    cd clibdill
    swift package init --type system-module
    

    然后我们修改下生成的package.swift 内容

    import PackageDescription
    let package = Package(
       name: "clibdill",
       pkgConfig: "libdill",
       providers: [
            .brew(["libdill"])
       ]
    )
    

    pkgConfig 等于使用了 pkg-config libcmark --libs --cflags包管理器可以通过它找到要导入的库的头文件和库搜索路径

    接着 我们创建一个 clibdill.h 的文件

    #ifndef __CLIBDILL_H__
    #define __CLIBDILL_H__
    
    #include <libdill.h>
    #include <libdillimpl.h>
    
    #endif
    

    头文件引入之

    而后,就到了重要的module.modulemap 这个文件 在advanced.swift中称之为模块地图,对于 C 或者 Objective-C 的库来说,想要它们在 Swift 编译器中可见,库必须按照 Clang 模块 的格式提供一份模块地图 (module map)。模块地图中最重要的事情是列举出组成模块所使用的头文件.
    在module.modulemap中编辑文件

    module CLibDill [system] {
        header "clibdill.h"
        link "dill"
    }
    

    最后就是git 提交

    git init
    git add .
    git commit "first commit"
    git tag -a 0.1.0
    

    这一步是必须的,因为你其他的工程引入该依赖时必须要有分支或者tag号

    我们用spm随便去创建个工程,只要把depency改为你的clibdill文件夹的地址,加上tag 号 即可。

    快乐的使用它吧




Log in to reply