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
go类型转换及与C的类型转换方式
May 05 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang bufio详细讲解
Apr 21 Golang
深入理解 Golang 的字符串
May 04 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制作新闻系统的思路
2006/10/09 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
ExpressJS入门实例
2015/01/14 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
jQuery使用方法
2017/02/04 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
html5的localstorage详解
2017/05/09 HTML / CSS
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
政协调研汇报材料
2014/08/15 职场文书
人事任命书范本
2015/09/21 职场文书
《云雀的心愿》教学反思
2016/02/23 职场文书
大学生党员暑假实践(活动总结)
2019/08/21 职场文书
一起来学习Python的元组和列表
2022/03/13 Python