您现在的位置是:网站首页> 编程资料编程资料
Golang 编译成DLL文件的操作_Golang_
2023-05-26
400人已围观
简介 Golang 编译成DLL文件的操作_Golang_
首先撰写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" ) //必须导入 import "C" //编译成动态库也是必须的 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
在当前文件夹会生成两个文件net.dll net.h
下面是使用:
#include#include #include #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
尽量不要用返回值来在C中处理,因为Go code不能在C分配的内存中存储指向Go分配的内存的指针,这个很重要,不然你就会在使用过程中各种崩溃。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
您可能感兴趣的文章:
相关内容
- golang调用c实现的dll接口细节分享_Golang_
- Golang如何调用windows下的dll动态库中的函数_Golang_
- go mod 使用私有gitlab群组的解决方案_Golang_
- golang实践-第三方包为私有库的配置方案_Golang_
- 解决go mod私有仓库拉取的问题_Golang_
- 完美解决golang go get私有仓库的问题_Golang_
- golang gopm get -g -v 无法获取第三方库的解决方案_Golang_
- go类型转换及与C的类型转换方式_Golang_
- Golang: 内建容器的用法_Golang_
- Go标准容器之Ring的使用说明_Golang_
