Go 可以导出 C ABI,然后在其它兼容 C ABI 的语言中调用。
下面详细讲解一下用法:
Go 构建动态库
- 定义一个 go 文件,包含以下代码:
|
|
go 的文件名称在当前示例中无关紧要,这里定义为 main.go。
main 函数是必须的,但是可以为空。
注意:代码中的 //export Add
表示导出 Add 函数,export
和 //
之间没有空格。这是 Go 中的一种特殊指令,类似的还有 //go:build
等。
- 然后我们构建动态库:
- Linux
|
|
这会生成两个文件:libmylib.so 和 libmylib.h
。
注意
-o
选项指定的名称:libmylib.so
,在 linux 上必须这样命名动态/静态库,其中 mylib 是我们实际要使用的名称。
- Mac
|
|
注意
-o
选项指定的名称:libmylib.dylib
,在 mac 上必须这样命名动态/静态库,其中 mylib 是我们实际要使用的名称。
使用
-buildmode=c-archive
可以构建静态链接库
通过这个指令,会生成两个文件:libmylib.dylib 和 libmylib.h
,其中 .h
文件是我们代码中要使用的,.dylib
是构建二进制程序时要使用的。
C 使用动态库
- 定义一个 main.c 文件(名称在当前示例中无关紧要):
|
|
在 main.c 中我们引入 libmylib.h
头文件,并调用在 Go 中导出的函数:Add 和 Multiply
。
- 构建二进制程序
|
|
我们使用 zig cc 构建二进制程序,关于 zig cc 的用法和优点,可以阅读这篇文章。
上述命令会生成一个名为 main 的二进制程序,调用执行一下:
|
|