CGO是Go的官方内置功能,它使创建引用C库的Go包成为可能。不仅如此,它也可以在相反的方向上实现。它使您可以从Go包中创建C库,以便C代码可以引用令人赞叹的Go。
将Go程序包构建为C共享库(或共享对象)
每个Go main软件包都可以构建为C共享库。
$ go build -go build -buildmode c-shared -o <c-lib>.so <go-package>
执行上述命令会将目标Go main软件包及其所有依赖项构建为单个C共享库,可以将其分发,安装和链接到任何C应用程序,以及可以引用C共享库的其他语言(C ++,Python,Javascript等) 。
注意:输出C共享库应以标准格式命名lib*.so。
生成C标头并将Go函数导出为C函数
将Go main程序包构建为C共享库也不会生成C头文件,也不会将任何Go函数公开为C符 。开发人员必须明确指出要公开哪些Go函数。
要将Go函数导出为C符 :
package main import "C"import ( "math/rand" "time")//export cgoCurrentMillisfunc cgoCurrentMillis() C.long { return C.long(time.Now().Unix()) }//export cgoSeedfunc cgoSeed(m C.long) { rand.Seed(int64(m))}//export cgoRandomfunc cgoRandom(m C.int) C.int { return C.int(rand.Intn(int(m))) }
在Go main包之上构建将生成一个C头文件<output>.h以及一个C共享库<output>.so。
// Other stuff. extern long int cgoCurrentMillis(); extern void cgoSeed(long int p0); extern int cgoRandom(int p0);
cgoCurrentMilli,cgoSeed并且cgoRandom在中也显示为C符 <output>.so。现在,每个C应用程序都可以包含头文件并使用公开的C符 。
#include <stdio.h> #include <cgo-random.h> int main() { cgoSeed(cgoCurrentMilli()); printf("Hello World from C!n"); printf("cgoRandom() -> %dn", cgoRandom(256)); return 0;}
翻译自:https://medium.com/@
phuctm97/build-and-use-go-packages-as-c-libraries-889eb0c19838
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!