目录

Go语言windows环境下生成dll文件

Go 语言 windows 环境下生成 dll 文件

文章目录

声明:我是 「米司特包」 ,本篇文章 首发 于 「米司博客」 ,其他平台为同步推送(因为可能文章路径会变动,所以就没放详细链接,进来的可以 根据标题查找 🔍)。

因为之前开发一个 Electron 项目,里面有一个功能用到了外部的 dll 文件,当时自己不会开发,还是找的其他项目组的同事帮忙写的一个 dll 文件,最近忽然想到这个,而且现在用 Go 也比较多,所以就想着用 Go 实现一下(因为之前了解过 cgo,但是没实际应用过,主要是我接触的项目并没有应用场景,但是我知道 Go 可以实现。),如果可以的话,以后写项目如果再需要用到,就不用麻烦别人了。

文章里面的示例代码已经放在 Github 了,下载地址 👇

1. 运行环境

  • windows 10:版本 Dev (OS 内部版本 21343.1000)
  • go go version go1.16 windows/amd64
  • gcc gcc.exe (tdm64-1) 9.2.0

windows 查看版本信息命令:winver

2. 实现

2.1 Go 代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// go_dll.go
package main

import "C"

//export Add
func Add(a C.int, b C.int) C.int {
	return a + b
}

//export Print
func Print(s *C.char) {

	// 函数参数可以用 string, 但是用*C.char更通用一些。
	// 由于string的数据结构,是可以被其它go程序调用的,
	// 但其它语言(如 nodejs)就不行了

	print("Hello ", C.GoString(s)) //这里不能用fmt包,会报错,调了很久...
}

func main() {
}

2.2 编译

1
go build -ldflags "-s -w" -buildmode=c-shared -o demo_go_dll.dll go_dll.go

2.3 结果

生成 .dll 和 .h 文件

https://gitee.com/misitebao/CDN/raw/master/md/image-20210331125052548.png

3. 调用

3.1 Go 语言调用

https://gitee.com/misitebao/CDN/raw/master/md/image-20210331133106311.png

输出:

https://gitee.com/misitebao/CDN/raw/master/md/image-20210331141251300.png

这只是一个简单的例子,实现基本的运算和输出,而且也只是在 Go 里面调用测试,后续还要测试在 node 里面调用测试,还要测试更加复杂的功能。

关于 node 调用 dll 的文章,可以在 node 分类里面查找