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分配的内存的指针,这个很重要,不然你就会在使用过程中各种崩溃。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持优爱好网。如有错误或未考虑完全的地方,望不吝赐教。
相关文章:
1. 怎么让div+css兼容ie6ie7ie8ie9和FireFoxChrome等浏览器2. requestAnimationFrame使用示例详解3. 基于JavaScript实现图片裁剪功能4. React优雅的封装SvgIcon组件示例5. uniapp自定义验证码输入框并隐藏光标6. 详解JavaScript中原始数据类型Symbol的使用7. JavaScript深拷贝方法structuredClone使用8. uniapp 手机验证码输入框实现代码(随机数、倒计时、隐藏手机号码中间四位)可以直接使用9. 使用Node.js实现Clean Architecture方法示例详解10. Jquery使用原生AJAX方法请求数据