Golang 编译成DLL文件的操作


Posted in Golang onMay 06, 2021

首先撰写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 <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;
}

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

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

Golang 相关文章推荐
go语言-在mac下brew升级golang
Apr 25 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Golang入门之计时器
May 04 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 Golang
完美解决golang go get私有仓库的问题
May 05 #Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 #Golang
go类型转换及与C的类型转换方式
May 05 #Golang
Golang: 内建容器的用法
May 05 #Golang
Go标准容器之Ring的使用说明
May 05 #Golang
go语言中GOPATH GOROOT的作用和设置方式
go设置多个GOPATH的方式
May 05 #Golang
You might like
php格式化电话号码的方法
2015/04/24 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
谈谈JS中的!!
2017/12/07 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
学习Django知识点分享
2019/09/11 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
得到Class的三个过程是什么
2012/08/10 面试题
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
大学生党课思想汇报
2013/12/29 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
领导失职检讨书
2014/02/24 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript
JavaScript获取URL参数的方法分享
2022/04/07 Javascript