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 相关文章推荐
Golang 正则匹配效率详解
Apr 25 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
解决golang 关于全局变量的坑
May 06 Golang
golang 实现时间戳和时间的转化
May 07 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Golang的继承模拟实例
Jun 30 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Golang 切片(Slice)实现增删改查
Apr 22 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/10/22 PHP
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
详解jQuery中的事件
2016/12/14 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
浅谈python标准库--functools.partial
2019/03/13 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
自动化专业职业生涯规划书范文
2014/01/16 职场文书
新年团拜会主持词
2014/04/02 职场文书
创业融资计划书
2014/04/25 职场文书
优秀教师感人事迹材料
2014/05/04 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
党员公开承诺书2016
2016/03/24 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
Java中的继承、多态以及封装
2022/04/11 Java/Android