一、准备。
1、GoLang在1.10版本之后开始支持编译windows动态链接库,可以打开命令行工具使用go version 查看自己的go版本。
2、你的电脑上需要gcc,如果没有的话[点击这里]下载安装,或者问度娘如何下载gcc,有的方法很慢,这是我折腾半天用的最快的方法,下载压缩包解压即可。
如果有32位版本的需要卸载重装这个64位的,这个很重要。
装完环境配置一下bin目录到环境变量中,打开命令行工具,输入gcc -v,如果出现以下信息,则配置成功:
二、编译。
1、命令很简单,就一行
> go build -ldflags "-s -w" -o main.dll -buildmode=c-shared main.go
-s 、-w 指令用于减小动态链接库的体积,-s是压缩,-w是去掉调试信息。-o可以指定生成文件的目录。命令可以简化成如下:
> go build -o main.dll -buildmode=c-shared main.go
这句命令执行结束后会在当前目录下生成一个.dll和一个.h文件,至此,编译部分就完成了。
三 、C调用示例。
1、编写lib.go,这里有两个地方需要注意:
(1)import "C"必须加上,编译需要C库的支持,方便类型转换
(2)//export GetData必须加上,指明该函数导出,而且必须是//export+ 空格+函数名,//和export之间加上空格也不行。
以上条件不满足编译不出.h文件。
2、编译,编译成功后目录下会多出一个.dll和.h文件
3、C语言调用
方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址。当一个 DLL 文件用 LoadLibrary 显式加载后,在任何时刻均可以通过调用 FreeLibrary 函数显式地从内存中卸载。
[注意]:每调用一次 LoadLibrary 函数就应调用一次 FreeLibrary 函数,以保证不会有多余的库模块在应用程序结束后仍留在内存中,否则导致内存泄漏。