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中semaphore(信号量)源码
Apr 03 Golang
win10下go mod配置方式
Apr 25 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
go类型转换及与C的类型转换方式
May 05 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang map映射的用法
Apr 22 Golang
GO中sync包自由控制并发示例详解
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下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
基于VUE.JS的移动端框架Mint UI的使用
2017/10/11 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
2019/04/15 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
Canvas 文本填充线性渐变的使用详解
2020/06/22 HTML / CSS
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
this关键字的含义
2015/04/08 面试题
模具专业毕业生自荐书范文
2014/02/19 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
单位委托函范文
2015/01/29 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers