Golang编译生成DLL文件
从1.10起,Go在windows平台上支持c-shared编译模式,即编译生成windows动态库文件。
环境配置
使用Go编译生成dll文件需要gcc支持。在Windows平台,比较常用的gcc是MinGW。
从官网获取最新的64位MinGW,将gcc.exe所在目录添加到系统变量中。
编写Go源文件
举一个简单的例子:
//example.go
package main
import "C"
import "fmt"
//export PrintFromDLL
func PrintFromDLL() {
fmt.Printf("From DLL: Hello, world!\n")
}
func main() {
// Need a main function to make CGO compile package as C shared library
}
三个要点:
1. import "C"。
2. 注释//export PrintFromDLL在编译生成dll文件时是不可缺少的,指明了dll文件暴露的函数。而且,注释和函数定义之间不能存在空行。
3. main函数在编译生成dll文件时也是必不可少的。
编译生成dll文件
在Go源文件所在目录下,执行如下命令,即可生成example.h和example.dll两个文件。
go build [-ldflags "-w -s"] -buildmode=c-shared -o example.dll example.go
其中,'-ldflags "-w -s"'为可选编译参数,减小编译生成的dll文件大小。"-s"为去掉符号表信息,"-w"为去掉调试信息。
Golang编译生成DLL文件的核心不是编译过程,而是Go与C的交互。
注意点
如果需要编译32位的dll文件,需要使用32位的gcc,其中有几个必须的参数,如下图所示。
// example.bat
set cc=i686-w64-mingw32-gcc // 如果系统变量中只有32位的gcc所在的目录,也可以使用默认参数gcc
set goarch=386
set CGO_ENABLED=1
go build -ldflags "-w -s" -buildmode=c-shared -o example.dll example.go
之前尝试过不配置系统变量,直接将go环境变量中CC为设置为32位gcc的绝对路径,但似乎并不支持,如下图所示:
还是需要在系统变量中配置32位gcc所在的目录。