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 Gin实现文件上传下载的示例代码
Apr 02 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang 结构体数据集合
Apr 22 Golang
Golang 入门 之url 包
May 04 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 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脚本的10个技巧(4)
2006/10/09 PHP
获得Google PR值的PHP代码
2007/01/28 PHP
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
对python判断是否回文数的实例详解
2019/02/08 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
Python jieba库分词模式实例用法
2021/01/13 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
文明寄语大全
2014/04/11 职场文书
植树节口号
2014/06/21 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
Golang入门之计时器
2022/05/04 Golang