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 相关文章推荐
golang json数组拼接的实例
Apr 28 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
golang elasticsearch Client的使用详解
May 05 Golang
go类型转换及与C的类型转换方式
May 05 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang解析JSON对象
Apr 30 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学习 运算符与运算符优先级
2008/06/15 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
学习ExtJS Panel常用方法
2009/10/07 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
2016/07/01 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
python编码总结(编码类型、格式、转码)
2016/07/01 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
python 函数中的参数类型
2020/02/11 Python
python数据爬下来保存的位置
2020/02/17 Python
python 实现图片裁剪小工具
2021/02/02 Python
毕业自我鉴定
2013/11/05 职场文书
经理职责范文
2013/11/08 职场文书
销售行政专员职责
2014/01/03 职场文书
企业党员公开承诺书
2014/03/26 职场文书
青年志愿者活动总结
2014/04/26 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
MySQL笔记 —SQL运算符
2022/01/18 MySQL