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
解决方案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
正常运行结果:
特殊说明
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>