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项目中使用init()
Apr 12 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
解决Go gorm踩过的坑
Apr 30 Golang
Golang二维数组的使用方式
May 28 Golang
Golang的继承模拟实例
Jun 30 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang生成并解析JSON
Apr 14 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 Golang
go goth封装第三方认证库示例详解
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
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
学习vue.js计算属性
2016/12/03 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
移动端效果之IndexList详解
2017/10/20 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
Python使用django获取用户IP地址的方法
2015/05/11 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
django中cookiecutter的使用教程
2020/12/03 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
大学生党员自我批评
2014/02/14 职场文书
人事部专员岗位职责
2014/03/04 职场文书
护理专科学生自荐书
2014/07/05 职场文书
聘任书格式及范文
2015/09/21 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript