GoLang编写Windows动态链接库(DLL)及C调用范例

一、准备。

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 函数,以保证不会有多余的库模块在应用程序结束后仍留在内存中,否则导致内存泄漏。

 

猜你喜欢

转载自www.cnblogs.com/Kingram/p/12088087.html
今日推荐