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语言带缓冲的通道实现
Apr 26 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang map映射的用法
Apr 22 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Go 内联优化让程序员爱不释手
Jun 21 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实现的购物车类实例
2015/06/17 PHP
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
python判断windows系统是32位还是64位的方法
2015/05/11 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
python如何制作缩略图
2019/04/30 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
上课睡觉检讨书
2014/01/28 职场文书
债务纠纷委托书
2014/08/30 职场文书
小石潭记导游词
2015/02/03 职场文书
2015年新学期寄语
2015/02/26 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
深入理解python协程
2021/06/15 Python
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python