您的位置:首页技术文章

Golang 编译成DLL文件的操作

【字号: 日期:2023-10-17 16:38:42浏览:10作者:馨心
首先撰写golang程序exportgo.go:

package mainimport '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 mainimport ( 'net')//必须导入import 'C'//编译成动态库也是必须的func main() {}//export Interfacesfunc 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

在当前文件夹会生成两个文件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:%sn', retc); free(retc); retc=NULL; } GoString* st=(GoString*)(slice.data); for (int i=0;i<retlen;i++) { printf('%sn', st[i].p); } free(slice.data); slice.data=NULL; return 0;}

尽量不要用返回值来在C中处理,因为Go code不能在C分配的内存中存储指向Go分配的内存的指针,这个很重要,不然你就会在使用过程中各种崩溃。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持优爱好网。如有错误或未考虑完全的地方,望不吝赐教。

标签: Golang
相关文章: