[Go实战]CGO 入门系列-手把手教程1

1,012 阅读2分钟

CGO 入门系列-手把手教程1

背景

官方支持 pkg.go.dev/cmd/cgo

CGO设置

要使用CGO特性,需要安装C/C构建工具链,在macOS和Linux下是要安装和GCC,在windows下是需要安装MinGW工具。同时需要保证环境变量`CGO_ENABLED`被设置为1,这表示CGO是被启用的状态。在本地构建时`CGO_ENABLED`默认是启用的,当交叉构建时CGO默认是禁止的。比如要交叉构建ARM环境运行的Go程序,需要手工设置好C/C交叉构建的工具链,同时开启`CGO_ENABLED`环境变量。然后通过`import "C"`语句启用CGO特性。

简单的调用 && 测试

demo1.go – 直接调用c内置方法

// hello.go
package main

//#include <stdio.h>
import "C"

func demo1() {
   C.puts(C.CString("Hello, World1\n"))
}

demo2.go – 调用自己写的方法

// hello.go
package main

/*
#include <stdio.h>

static void SayHello2(const char* s) {
    puts(s);
}
*/
import "C"

func demo2() {
   C.SayHello2(C.CString("Hello, World2\n"))
}

demo3.go – 调用.h文件的方法

package main

//#include"lib/hello.h"
import "C"

func demo3(){
   C.SayHello(C.CString("Hello, World3\n"))
}

lib/hello.h – .h文件

// hello.c

#include <stdio.h>

void SayHello(const char* s) {
   puts(s);
}

main.go

package main

func main() {
   demo1()
   demo2()
   demo3()
}

运行报错:

报错问题:

# cgo
cc1.exe: sorry, unimplemented: 64-bit mode not compiled in

解决:

解决方案1:goland启动设置

CGO_ENABLED=1;GOOS=windows;GOARCH=386

图片.png

解决方案2:环境设置(win/linux)

Windows:
SET CGO_ENABLED=1
SET GOOS=windows
SET GOARCH=386
go build -o server.exe main.go

Linux:
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o server main.go

正常运行结果:

图片.png

特殊说明

Go和C互相调用指针

Go调用C Code时,Go传递给C Code的Go指针所指的Go Memory中不能包含任何指向Go Memory的Pointer。C调用的Go函数不能返回指向Go分配的内存的指针。

参考

参考链接:<https://blog.csdn.net/weixin_34055787/article/details/88883037>
参考链接:<https://chai2010.cn/advanced-go-programming-book/ch2-cgo/ch2-07-memory.html>

cgo支持类型查询

1.png

github项目地址:

github.com/zld126126/M…

未完待续…