c++函数不明确_构建和使用Go软件包作为C库

4f5acc98270efa6ba4e59c9dc871b156.png

CGO是Go的官方内置功能,它使创建引用C库的Go包成为可能。不仅如此,它也可以在相反的方向上实现。它使您可以从Go包中创建C库,以便C代码可以引用令人赞叹的Go。


将Go程序包构建为C共享库(或共享对象)

每个Go main软件包都可以构建为C共享库。

$ go build -go build -buildmode c-shared -o .so 

执行上述命令会将目标Go main软件包及其所有依赖项构建为单个C共享库,可以将其分发,安装和链接到任何C应用程序,以及可以引用C共享库的其他语言(C ++,Python,Javascript等) 。

注意:输出C共享库应以标准格式命名lib*.so。

生成C标头并将Go函数导出为C函数

将Go main程序包构建为C共享库也不会生成C头文件,也不会将任何Go函数公开为C符号。开发人员必须明确指出要公开哪些Go函数。

要将Go函数导出为C符号:

  • 在Go函数的顶部添加注释//export FuncName。
  • 包含函数的Go文件代码必须为import "C"。
  • 该功能必须属于main包。
  • 函数签名既不能具有Go结构,也不能具有Go接口,也不能具有Go数组或可变参数。
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头文件.h以及一个C共享库.so。

// Other stuff. extern long int cgoCurrentMillis(); extern void cgoSeed(long int p0); extern int cgoRandom(int p0);

cgoCurrentMilli,cgoSeed并且cgoRandom在中也显示为C符号.so。现在,每个C应用程序都可以包含头文件并使用公开的C符号。

#include  #include  int main() {  cgoSeed(cgoCurrentMilli());   printf("Hello World from C!");  printf("cgoRandom() -> %d
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值