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 }
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)庫也是必須的 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> #includestdlib.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;iretlen;i++) { printf("%s\n", st[i].p); } free(slice.data); slice.data=NULL; return 0; }
盡量不要用返回值來在C中處理,因?yàn)镚o code不能在C分配的內(nèi)存中存儲(chǔ)指向Go分配的內(nèi)存的指針,這個(gè)很重要,不然你就會(huì)在使用過程中各種崩潰。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
標(biāo)簽:重慶 欽州 蘭州 雞西 汕頭 梅河口 銅川 吐魯番
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang 編譯成DLL文件的操作》,本文關(guān)鍵詞 Golang,編,譯成,DLL,文件,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。