searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Golang编译生成DLL文件以及注意点

2023-06-15 01:29:35
626
0

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所在的目录。

0条评论
0 / 1000
杨****为
3文章数
0粉丝数
杨****为
3 文章 | 0 粉丝
杨****为
3文章数
0粉丝数
杨****为
3 文章 | 0 粉丝
原创

Golang编译生成DLL文件以及注意点

2023-06-15 01:29:35
626
0

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所在的目录。

文章来自个人专栏
专栏1
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0