Golang 編譯成DLL文件的操作
更新時間:2021年05月06日 10:04:10 作者:冷月醉雪
這篇文章主要介紹了Golang 編譯成DLL文件的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
首先撰寫golang程序exportgo.go:
package main import "C" import "fmt" //export PrintBye func PrintBye() { fmt.Println("From DLL: Bye!") } //export Sum func Sum(a int, b int) int { return a + b; } func main() { // Need a main function to make CGO compile package as C shared library }
編譯成 DLL 文件:
go build -buildmode=c-shared -o exportgo.dll exportgo.go
編譯后得到 exportgo.dll 和 exportgo.h兩個文件。
補充:Go1.10在編譯成dll小實例
看代碼吧~
package main import ( "net" ) //必須導(dǎo)入 import "C" //編譯成動態(tài)庫也是必須的 func main() {} //export Interfaces func Interfaces(list []string, retlen *int) string { interf, err := net.InterfaceAddrs() if err != nil { return err.Error() } for i, v := range interf { if i >= len(list) { break } list[i] = v.String() } *retlen = len(list) return "" }
編譯命令:
go build -ldflags "-s -w" -buildmode=c-shared -o net.dll main.go
在當(dāng)前文件夾會生成兩個文件net.dll net.h
下面是使用:
#include <stdio.h> #include<stdlib.h> #include <string.h> #include "net.h" int main() { GoString ret; GoSlice slice; slice.len=10; slice.cap=0; slice.data=calloc(10,sizeof(GoString)); GoInt retlen=0; ret=Interfaces(slice,&retlen); if (ret.n != 0) { char* retc = calloc(ret.n+1,sizeof(char)); memcpy(retc,ret.p,ret.n); printf("Return value:%s\n", retc); free(retc); retc=NULL; } GoString* st=(GoString*)(slice.data); for (int i=0;i<retlen;i++) { printf("%s\n", st[i].p); } free(slice.data); slice.data=NULL; return 0; }
盡量不要用返回值來在C中處理,因為Go code不能在C分配的內(nèi)存中存儲指向Go分配的內(nèi)存的指針,這個很重要,不然你就會在使用過程中各種崩潰。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
使用golang引入外部包的三種方式:go get, go module, ve
這篇文章主要介紹了使用golang引入外部包的三種方式:go get, go module, vendor目錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01go?doudou開發(fā)gRPC服務(wù)快速上手實現(xiàn)詳解
這篇文章主要為大家介紹了go?doudou開發(fā)gRPC服務(wù)快速上手實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12