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
解决go在函数退出后子协程的退出问题
Apr 30 Golang
对Golang中的FORM相关字段理解
May 02 Golang
go类型转换及与C的类型转换方式
May 05 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Golang的继承模拟实例
Jun 30 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
golang 语言中错误处理机制
Aug 30 Golang
Golang jwt身份认证
Apr 20 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 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提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
解析php类的注册与自动加载
2013/07/05 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python中global用法实例分析
2015/04/30 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
戴森西班牙官网:Dyson西班牙
2020/02/04 全球购物
医科大学生毕业的自我评价分享
2013/11/12 职场文书
会议活动邀请函
2014/01/27 职场文书
家长给小学生的评语
2014/01/30 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
常务副总经理任命书
2014/06/05 职场文书
民族精神月活动总结
2014/08/28 职场文书
会计工作能力自我评价
2015/03/05 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书