如何在Swift中调用C库(入门篇)

Swift已经开源了差不多一个月了。Swift在server端的应用前景喜人,尤其是Swift天然对C的兼容,让Swift得以在短时间内就拥有了大量的库支持。所以广大Swift开发者都在积极尝试使用Swift封装C库的方法来迅速拓展Swift在server上的实现。 这里我以封装Redis官方推出的C库Hiredis举例来说明如何在Swift中调用C库。

搭建Swift环境

前往Swift官网下载安装Swift https://swift.org/download/。上面有Mac和Linux平台上详细的安装说明,我就不细说了。

安装Redis和Hiredis

既然是对Redis做操作,当然安装Redis。另外还需要Hiredis,它是Redis官方推出的基于C语言的客户端。这是Hiredis的github地址:https://github.com/redis/hiredis Ubuntu下安装
sudo apt-get install redis-server libhiredis-dev

创建Swift包

实际上Swift对C库的调用,在SPM(Swift Package Managemer)的文档页面里已经有了比较详细的介绍:https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md。 首先创建包和包描述文件Package.swift。
mkdir CHreids
touch Package.swift
注意,这里作为一个约定,对C库封装的Swift包的名字以大写C为首字母,后面跟这个C库的名称(注意大小写)。 然后在CHredis创建module.modulemap,内容为:
module CHiredis [system] {
    header "/usr/include/hiredis/hiredis.h"
    link "hiredis"
    export *
}
这样就建立C到Swift的映射,Swift就会通过hiredis.h导入对应libhiredis.so中的function。然后我们在Swift只要import CHredis,就可以直接使用其中C语言的function了。不过Swift中对包的版本依赖是通过git来实现的,所以还需要以下几步:
git init
git add Package.swift module.modulemap
git commit -m "Initial commit"
git tag 0.1.0
我将以上代码传到我的Github上:https://github.com/fengluo/CHiredis,tag为0.1.0

创建Swift应用

我们在CHiredis的平级目录下创建一个测试应用来检验一下。 cd .. mkdir SwiftHiredis && cd SwiftHiredis touch Package.swift main.swift 其中我们依然需要一个Package.swift文件,其中我们会声明对CHiredis的依赖,其内容为:
import PackageDescription

let package = Package(
    dependencies: [
        .Package(url: "../CHireds", majorVersion: 0, minor: 1)
    ]
)
在一个Swift应用中,必须要创建一个main.swift文件做为入口。这里我简单做一下示例,其内容为:
import CHiredis

let conn:UnsafeMutablePointer<redisContext>  = redisConnect("127.0.0.1",6379)
print(conn.memory)
这样就基本完成了,然后编译一下。
swift build
Swift会将依赖的CHiredis复制到该应用下的Packages文件夹中。如果编译成功,将会得到一个可运行的文件 .build/debug/SwiftHiredis。运行该文件将会得到redis链接信息,就代表正确运行了。
.build/debug/redistest
redisContext(err: 0, errstr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), fd: 3, flags: 3, obuf: 0x00000000021ac1c8, reader: 0x00000000021ac1e0)
以上代码我以上传至github:https://github.com/fengluo/SwiftHiredis tag为:0.1.0

总结

以上算是Swift对C库封装调用的入门教程,基本上都可以在官方文档上找到相关内容。下一篇文章中我会深入讲讲在Swift如何调用hiredis库中更多的方法,及其遇到的问题和好的开发实践。