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 25 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
golang import自定义包方式
Apr 29 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go Plugins插件的实现方式
Aug 07 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
基于Python实现西西成语接龙小助手
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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
php中in_array函数用法分析
2014/11/15 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
星球大战与Python之间的那些事
2016/01/07 Python
Python字符串切片操作知识详解
2016/03/28 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
《藤野先生》教学反思
2014/02/19 职场文书
2014国培学习感言
2014/03/05 职场文书
给校长的建议书600字
2014/05/15 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
政审证明范文
2015/06/19 职场文书