美文网首页
构建和使用Go软件包作为C库

构建和使用Go软件包作为C库

作者: 开心人开发世界 | 来源:发表于2019-10-22 17:27 被阅读0次

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符号:

  • 在Go函数的顶部添加注释//export FuncName
  • 包含函数的Go文件代码必须为import "C"
  • 该功能必须属于main包。
  • 函数签名既不能具有Go结构,也不能具有Go接口,也不能具有Go数组或可变参数。
package main  
import "C"
import (
    "math/rand"
    "time"
)
//export cgoCurrentMillis
func cgoCurrentMillis() C.long {
    return C.long(time.Now().Unix()) 
}
//export cgoSeed
func cgoSeed(m C.long) {
    rand.Seed(int64(m))
}
//export cgoRandom
func 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);

cgoCurrentMillicgoSeed并且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() -> %d\n", cgoRandom(256));     
    return 0;
}

翻译自:https://medium.com/@phuctm97/build-and-use-go-packages-as-c-libraries-889eb0c19838

相关文章

网友评论

      本文标题:构建和使用Go软件包作为C库

      本文链接:https://www.haomeiwen.com/subject/zmxcvctx.html