【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用

环境描述:

win10

cuda 9.0

vs2017

vc++2015 redistributable update 3 and Build tools

目标及实现步骤 #1

将 CUDA 核心计算函数以静态库的方式为应用程序所用

1.1 新建静态库项目

1.1.1 新建项目

打开vs2017,新建-项目-CUDA 9.0 Runtime , 输入项目名称 “cuda01_lib”

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第1张图片

注意:这里并没有指定 静态库,需要在建好后的项目属性中设置,下文会有图示。

新项目自动生成的代码 kernel.cu 是一个完整的 cuda 应用代码。为了生成静态库,首先去除main()函数,并为库接口函数编写相应的头文件。  

1.1.2 添加头文件

为当前项目 ( cuda01_lib )添加-新项-头文件(.h)-输入名称“cuda01_lib.h”

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第2张图片

 将 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"

1.1.3 项目属性更改

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第3张图片

1.1.4 生成 cuda01_lib.lib

1.2 添加应用项目

1.2.1 添加项目

在cuda01_lib 项目所属的解决方案上, 添加-新建项目,输入名称 cuda01_with_lib

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第4张图片

 自动生成 kernel.cu , 去除接口函数的定义、引入头文件,重命名为 kernel.cpp

1.2.2 添加引用

引用静态库项目

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第5张图片

1.2.3 配置项目属性

平台工具集=Visual Studio 2015 (v140)

要点:必须配置附加头文件目录

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第6张图片

 cuda01_with_lib.exe 可以生成啦 !

将 cuda01_with_lib 项目设置为启动项,运行:

{1,2,3,4,5} + {10,20,30,40,50} = {11,22,33,44,55}

 1.3 静态库项目及其引用的应用项目小结:

新建静态库项目 cuda01_lib,新建头文件 cuda01_lib.h,完善源文件 kernel.cu,项目配置类更改为静态库;

添加应用项目 cuda01_with_lib , 完善源文件 kernel.cpp ,项目添加引用(静态库项目 cuda01_lib ),项目配置附加头文件目录。

目标及实现步骤 #2

将 CUDA 核心计算函数以动态库的方式为应用程序所用。

2.1 新建动态库项目

2.1.1 新建项目

参考1.1.1, 新建项目名称 hello_dll

2.1.2 添加头文件

头文件名称 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 ,只有这样,才能为应用程序引用。

2.1.3 配置项目

配置类型=动态库(.dll)

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第7张图片

预处理器定义

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第8张图片

 可以生成 hello_dll.dll 啦,同时生成的还有 hello_dll.lib !

2.2 添加应用项目

2.2.1 添加项目

hello_with_dll

2.2.2 添加引用

引用动态库项目:hello_dll

2.2.3 配置项目属性

附加包含目录

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第9张图片

附加库目录

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第10张图片

附加依赖项

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第11张图片

 可以生成程序啦!

ok~

参考

创建和使用动态链接库

补充:直接新建项目调用动态库

除了上述的方法【在解决方案下添加-新建项目,添加引用】外,还可以直接新建应用项目来调用动态库dll。

问题#1:无法添加引用?

需要配置项目(附加包含目录,附加库目录,附加依赖项),可以生成动态库应用程序。

问题#2:执行缺少dll文件?

需要配置项目:生成事件-后期生成事件 post-build event ) -

【HelloCUDA】win10下 首个 cuda9 应用程序 及 静态库(.lib) 动态库(.dll)的引用_第12张图片

command line :输入

xcopy /y /d "D:\WorkSpace\VisualStudio2017cpp\hello_dll\x64\Debug\hello_dll.dll" "$(OutDir)" 

这样可以将所需dll文件复制到应用程序输出目录,可顺利执行程序!

你可能感兴趣的:(cuda)