今天又把windows坑踩了个遍

一、重要声明!!!
windows上貌似不支持go加载windows静态库,还是乖乖使用动态库吧

二、 DLL生成
1、首先安装vs,我是用的是vs2017,至于使用什么版本的vs,请查看https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html

2、然后安装nvidia驱动等,从官网下载即可(https://developer.nvidia.com/cuda-downloads)
3、打开vs创建工程,步骤如下:

移除自带的代码文件和头文件:

添加自己的文件和头文件:

对工程进行如下修改:
右键工程名称->生成依赖项-.>生成自定义,选上cuda

右键源文件(上面来说是sm3.cu)->属性(从下拉菜单中选择cuda c/c++)

右键工程名称->属性,在如下位置加上cudart.lib

PS:头文件需对导出的函数加如下信息:
#define DLL_API extern “C” _declspec(dllexport)
同样对源文件需要导出的函数加:
DLL_API int test()
右键工程名称->生成,即可在工程目录下生成指定的dll文件。

三、go语音对动态库的引用
请参考https://github.com/golang/go/wiki/WindowsDLLs,很详细,下面主要内容:
//加载动态库
user32, _ = syscall.LoadLibrary(“user32.dll”)
//获取动态库中函数地址
messageBox, _ = syscall.GetProcAddress(user32, “MessageBoxW”)
//调用函数,4为参数个数
ret, _, callErr := syscall.Syscall9(uintptr(messageBox),
4,
0,
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))),
style,
0,
0,
0,
0,
0)
//释放内存
defer syscall.FreeLibrary(user32)
四、出现问题解决
执行程序时加载动态库失败
1、分析上述代码中参数传递是否正确,注意参数传递时的指针uintptr
2、尝试使用管理员权限执行cmd,再执行程序
3、若在其他没有vs的机器上执行发生的问题,尝试安装一下vs运行时库