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二维切片初始化的实现
Apr 08 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Go标准容器之Ring的使用说明
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Go语言入门exec的基本使用
May 20 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
Go gorilla/sessions库安装使用
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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
职代会闭幕词
2015/01/28 职场文书
公务员个人年终总结
2015/02/12 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
趣味运动会广播稿
2015/08/19 职场文书
深入理解python多线程编程
2021/04/18 Python
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
详解MySQL中的pid与socket
2021/06/15 MySQL
选购到合适的激光打印机
2022/04/21 数码科技