日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/5/8 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。