[Go实战]CGO 入门系列-手把手教程1
生活随笔
收集整理的這篇文章主要介紹了
[Go实战]CGO 入门系列-手把手教程1
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
CGO 入門系列-手把手教程1
- 背景
- CGO設(shè)置
- 簡單的調(diào)用 && 測試
- 運(yùn)行報(bào)錯(cuò):
- 報(bào)錯(cuò)問題:
- 解決:
- 解決方案1:goland啟動(dòng)設(shè)置
- 解決方案2:環(huán)境設(shè)置(win/linux)
- 正常運(yùn)行結(jié)果:
- 特殊說明
- Go和C互相調(diào)用指針
- 參考
- cgo支持類型查詢
- github項(xiàng)目地址:
- 未完待續(xù)...
背景
官方支持 https://pkg.go.dev/cmd/cgo
CGO設(shè)置
要使用CGO特性,需要安裝C/C構(gòu)建工具鏈,在macOS和Linux下是要安裝和GCC,在windows下是需要安裝MinGW工具。同時(shí)需要保證環(huán)境變量`CGO_ENABLED`被設(shè)置為1,這表示CGO是被啟用的狀態(tài)。在本地構(gòu)建時(shí)`CGO_ENABLED`默認(rèn)是啟用的,當(dāng)交叉構(gòu)建時(shí)CGO默認(rèn)是禁止的。比如要交叉構(gòu)建ARM環(huán)境運(yùn)行的Go程序,需要手工設(shè)置好C/C交叉構(gòu)建的工具鏈,同時(shí)開啟`CGO_ENABLED`環(huán)境變量。然后通過`import "C"`語句啟用CGO特性。簡單的調(diào)用 && 測試
demo1.go – 直接調(diào)用c內(nèi)置方法
// hello.go package main//#include <stdio.h> import "C"func demo1() {C.puts(C.CString("Hello, World1\n")) }demo2.go – 調(diào)用自己寫的方法
// 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 – 調(diào)用.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 mainfunc main() {demo1()demo2()demo3() }運(yùn)行報(bào)錯(cuò):
報(bào)錯(cuò)問題:
# cgo cc1.exe: sorry, unimplemented: 64-bit mode not compiled in解決:
解決方案1:goland啟動(dòng)設(shè)置
CGO_ENABLED=1;GOOS=windows;GOARCH=386解決方案2:環(huán)境設(shè)置(win/linux)
Windows: SET CGO_ENABLED=1 SET GOOS=windows SET GOARCH=386 go build -o server.exe main.goLinux: SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build -o server main.go正常運(yùn)行結(jié)果:
特殊說明
Go和C互相調(diào)用指針
Go調(diào)用C Code時(shí),Go傳遞給C Code的Go指針?biāo)傅腉o Memory中不能包含任何指向Go Memory的Pointer。C調(diào)用的Go函數(shù)不能返回指向Go分配的內(nèi)存的指針。參考
參考鏈接:<https://blog.csdn.net/weixin_34055787/article/details/88883037> 參考鏈接:<https://chai2010.cn/advanced-go-programming-book/ch2-cgo/ch2-07-memory.html>cgo支持類型查詢
github項(xiàng)目地址:
https://github.com/zld126126/MyGolang/tree/main/cgo
未完待續(xù)…
總結(jié)
以上是生活随笔為你收集整理的[Go实战]CGO 入门系列-手把手教程1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Win10 IIS 的最小配置
- 下一篇: ABAP 外币金额转人民币金额函数 CO