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语言map与string的相互转换的实现
Apr 07 Golang
Golang二维切片初始化的实现
Apr 08 Golang
为什么不建议在go项目中使用init()
Apr 12 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Golang map映射的用法
Apr 22 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
Go结合Gin导出Mysql数据到Excel表格
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中几种常见安全设置详解
2010/04/06 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
DWR Ext 加载数据
2009/03/22 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
初识Node.js
2014/09/03 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
Vue中props的使用详解
2018/06/15 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
python基于queue和threading实现多线程下载实例
2014/10/08 Python
python有证书的加密解密实现方法
2014/11/19 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
django解决跨域请求的问题
2018/11/11 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
Keras loss函数剖析
2020/07/06 Python
numpy实现RNN原理实现
2021/03/02 Python
python 递归相关知识总结
2021/03/03 Python
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
长青弘远的面试题
2012/06/09 面试题
九年级体育教学反思
2014/01/23 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers
i7 6700处理器相当于i5几代
2022/04/19 数码科技