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 interface{}==nil 的几种坑及原理分析
Apr 24 Golang
Go语言中的UTF-8实现
Apr 26 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
golang 实现Location跳转方式
May 02 Golang
go设置多个GOPATH的方式
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang 实现WebSockets
Apr 24 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 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php url地址栏传中文乱码解决方法集合
2010/06/25 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
给ECShop添加最新评论
2015/01/07 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
2017/05/15 PHP
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
详解Vite的新体验
2021/02/22 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
python selenium 弹出框处理的实现
2019/02/26 Python
Python 音频生成器的实现示例
2019/12/24 Python
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
String是最基本的数据类型吗?
2013/06/13 面试题
Ejb技术面试题
2015/04/29 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
环保建议书300字
2014/05/14 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL