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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
golang 实现Location跳转方式
May 02 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Golang的继承模拟实例
Jun 30 Golang
Go 语言结构实例分析
Jul 04 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go Plugins插件的实现方式
Aug 07 Golang
golang使用map实现去除重复数组
Apr 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
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
Vue实现简单分页器
2018/12/29 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
对python调用RPC接口的实例详解
2019/01/03 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
城市精细化管理实施方案
2014/03/04 职场文书
公司活动方案范文
2014/03/06 职场文书
信息管理应届生求职信
2014/03/07 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
会计试用期自我评价
2014/09/19 职场文书
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers