win10
cuda 9.0
vs2017
vc++2015 redistributable update 3 and Build tools
将 CUDA 核心计算函数以静态库的方式为应用程序所用
打开vs2017,新建-项目-CUDA 9.0 Runtime , 输入项目名称 “cuda01_lib”
注意:这里并没有指定 静态库,需要在建好后的项目属性中设置,下文会有图示。
新项目自动生成的代码 kernel.cu 是一个完整的 cuda 应用代码。为了生成静态库,首先去除main()函数,并为库接口函数编写相应的头文件。
为当前项目 ( cuda01_lib )添加-新项-头文件(.h)-输入名称“cuda01_lib.h”
将 kernel.cu 中 接口函数 addWithCuda 的定义移入头文件 cuda01_lib.h 中:
#pragma once
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include
extern "C" cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);
修改 kernel.cu ,加入头文件:
#include "cuda01_lib.h"
在cuda01_lib 项目所属的解决方案上, 添加-新建项目,输入名称 cuda01_with_lib
自动生成 kernel.cu , 去除接口函数的定义、引入头文件,重命名为 kernel.cpp
引用静态库项目
平台工具集=Visual Studio 2015 (v140)
要点:必须配置附加头文件目录
cuda01_with_lib.exe 可以生成啦 !
将 cuda01_with_lib 项目设置为启动项,运行:
{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}
新建静态库项目 cuda01_lib,新建头文件 cuda01_lib.h,完善源文件 kernel.cu,项目配置类更改为静态库;
添加应用项目 cuda01_with_lib , 完善源文件 kernel.cpp ,项目添加引用(静态库项目 cuda01_lib ),项目配置附加头文件目录。
将 CUDA 核心计算函数以动态库的方式为应用程序所用。
参考1.1.1, 新建项目名称 hello_dll
头文件名称 hello_dll.h
完善头文件:
#pragma once
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
extern "C" MYDLL_API cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);
需要注意: MYDLL_EXPORTS 和 MYDLL_API 的写法,不可缺少!
没做过vs开发的我,一开始没注意到,没写这些,只是关注 dll 生成了,可就是没法为应用程序引用,报错信息中一直找 lib, 还以为项目配置有误,啊~~~,还好,官网示例仔细看了,总算发现了。
头文件中写好 MYDLL_EXPORTS 和 MYDLL_API ,再配合下文的项目配置的预处理器定义,动态库项目会在生成 my.dll 的同时也生成 my.lib ,只有这样,才能为应用程序引用。
配置类型=动态库(.dll)
预处理器定义
可以生成 hello_dll.dll 啦,同时生成的还有 hello_dll.lib !
hello_with_dll
引用动态库项目:hello_dll
附加包含目录
附加库目录
附加依赖项
可以生成程序啦!
ok~
创建和使用动态链接库
除了上述的方法【在解决方案下添加-新建项目,添加引用】外,还可以直接新建应用项目来调用动态库dll。
需要配置项目(附加包含目录,附加库目录,附加依赖项),可以生成动态库应用程序。
需要配置项目:生成事件-后期生成事件 post-build event ) -
command line :输入
xcopy /y /d "D:\WorkSpace\VisualStudio2017cpp\hello_dll\x64\Debug\hello_dll.dll" "$(OutDir)"
这样可以将所需dll文件复制到应用程序输出目录,可顺利执行程序!