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项目中使用init()
Apr 12 Golang
golang json数组拼接的实例
Apr 28 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Golang二维数组的使用方式
May 28 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang日志包的使用
Apr 20 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
Go语言怎么使用变长参数函数
Jul 15 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
javascript call和apply方法
2008/11/24 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
js比较日期大小的方法
2015/05/12 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
python操作gmail实例
2015/01/14 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
python xlsxwriter创建excel图表的方法
2018/06/11 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
2020/01/06 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
Python创建自己的加密货币的示例
2021/03/01 Python
智能旅行箱:Horizn Studios
2018/04/30 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
土木工程实习生自我鉴定
2013/09/19 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
考察邀请函范文
2015/01/31 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技