通过cgo可以将go的程序编译成库,在其他程序,如C程序中调用。cgo本身就提供了多平台的支持。不过对于每个平台还需要有相应的C编译工具链的支持,对不同平台的支持程度也不一致,需要针对每个平台单独处理。
新建文件 lib.go,通过import C启用cgo,export指定需要导出的方法。cgo编译后会生成相应的头文件,在C程序中包含这个头文件,链接时链接生成的库即可使用。
package main
import "C"
//export add
func add(a, b C.int) C.int {
return a + b
}
func main() {
}
编译Linux平台的库
Linux平台的编译最为顺利,有其实就在Linux上操作,只要安装gcc即可。
安装C编译器
因为本身就64位的系统,默认安装gcc即可,如果需要编译32位的库,则需要单独安装针对32位版本的gcc。
$ sudo apt install gcc
编译静态库
$ CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CC=gcc go build -buildmode=c-archive -o libcgotest.a lib.go
编译动态库
$ CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CC=gcc go build -buildmode=c-shared -o libcgotest.so lib.go