说明:go在windows下可以导出静态库和动态库,静态库是.a文件是不能给vs使用的,也没法转成vs使用的静态库。动态库(C++导出的动态库也是不行的,因为C++重载函数的存在使得不同编译器函数改名不一致,所以dll不具有二进制级别的共享性,参考资料)是可以给VS使用的,但是windows下使用需要头文件、lib文件和dll文件,接下来只需要将dll文件生成lib文件即可。
使用步骤
- go build生成dll文件和.h文件:
go build -ldflags "-s -w" -buildmode=c-shared -o xxx.dll
如果要生成32位的dll,交叉编译不支持CGO,windows32位系统下又可能不支持编译dll,需要用gcc将静态库转成动态库(安装32位mingw编译器),命令如下
go build -ldflags "-s -w" -buildmode=c-archive -o xxx.a
ar x xxx.a
gcc -shared -o xxx.dll *.o -lwinmm -lntdll -lWs2_32
- 编写def文件, 写上需要导出使用的函数名:
EXPORTS
DownloadRes
GetCurrentDownloadSize
GetDownloadSpeed
GetDownloadState
GetTotalDownloadSize
InitClient
StartClient
StopClient
也可以使用VS安装目录提供的dumpbin工具生成def文件,dumpbin工具在VS的安装目录的VC\bin\dumpbin.exe
, 使用命令dumpbin.exe /exports xxx.dll > xxx.def
生成def文件,不过需要修改成def模板格式。
- 使用lib工具将def文件生成lib文件,lib工具在VS目录下的
VC\bin\lib.exe
,使用命令lib.exe /machine:X64 /def:xxx.def
生成lib文件(32位则用/machine:X86)。至此已经得到头文件,lib文件和dll文件。