Golang 編譯成DLL文件的操作
首先撰寫(xiě)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兩個(gè)文件。
補(bǔ)充:Go1.10在編譯成dll小實(shí)例
看代碼吧~
package main import ( "net" ) //必須導(dǎo)入 import "C" //編譯成動(dòng)態(tài)庫(kù)也是必須的 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)前文件夾會(huì)生成兩個(gè)文件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; }
盡量不要用返回值來(lái)在C中處理,因?yàn)镚o code不能在C分配的內(nèi)存中存儲(chǔ)指向Go分配的內(nèi)存的指針,這個(gè)很重要,不然你就會(huì)在使用過(guò)程中各種崩潰。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go語(yǔ)言中?Print?Printf和Println?的區(qū)別解析
這篇文章主要介紹了Go語(yǔ)言中?Print?Printf和Println?的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Go 標(biāo)準(zhǔn)庫(kù)增加metrics指標(biāo)探討分析
go中有一個(gè)神奇的標(biāo)準(zhǔn)庫(kù) runtime/metrics,提供了一系列預(yù)定義好的 Go 自身的相關(guān)指標(biāo),如果沒(méi)有編寫(xiě)過(guò)基礎(chǔ)監(jiān)控庫(kù)或者關(guān)注的比較少的朋友可能會(huì)沒(méi)接觸到這類(lèi)指標(biāo),本文展開(kāi)現(xiàn)有metrics 指標(biāo),并結(jié)合現(xiàn)有的社區(qū)討論一起看看還有沒(méi)有必要增加更多的標(biāo)準(zhǔn)庫(kù)指標(biāo)2023-10-10