之前没有使用过VS、也不会C++编程,项目开发过程中有同事负责算法部署工作,但每次算法推断batch、检测类别等变动,都要对接那个同事,获取新的dll文件,感觉自己有必要学习yolo模型封装c++dll接口文件的流程,下面是过程及问题记录,以备查阅。
目录
VS创建动态链接库项目基础步骤
1、首先打开VS,选择文件>新建->项目,在弹出的界面中选择window桌面和具有导出项的(DLL)动态链接库。输入名称和项目保存的路径位置,然后点击确定。


2、点击展开头文件和源文件,可以看到生成了DLLCreate.h、framework.h、pch.h以及源文件DLLCreate.cpp、dillmain.cpp、pch.cpp。其中dillmain.cpp、framework.h、pch.h、pch.cpp的文件名是创建时默认配置的,DLLCreate.h、DLLCreate.cpp文件名与创建项目时输入的名称保持一致。

3、将项目的模式改为Debug X64,点击生成->生成解决方案,得到结果如下图所示。同时在项目路径中也生成了一个x64文件夹,该文件夹用于后续存放与动态链接库相关文件。


基于cuda\yolo模型创建动态链接库步骤
1. 新建一个动态链接库的工程项目

2.配置opencv,cuda, tenorRT属性表

(1)TensorRT配置表如下:
Tensorrt包含目录和库文件都在自己的Tensorrt安装路径下


附件依赖项:
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib
(2)OpenCV配置表如下:
Opencv包含目录和库文件都在自己的Opencv安装路径下


(3)CUDA配置表如下:
直接拷贝CUDA安装目录下现成的文件,一般在CUDA的默认安装地址:
# 我的cuda配置文件路径
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\extras\visual_studio_integration\MSBuildExtensions\CUDA_11.7.props

3.解决方案文件配置
(1)下载TensorRT-Alpha,下载链接:TensorRT-alpha
(2)下载后解压TensorRT-Alpha
(3) 按照下图进行文件配置

上图中红色圈中的为添加的现有文件,绿色圈的文件为新建的文件。其中utils中所有文件是从TensorRT-Alpha下utils中直接拷贝过来,如下图。通过utils.cpp和utils.h,可以修改模型的类别名称,类别数量,显示颜色配置等。

其中源文件中的红色圈中的文件是从Tensorrt-Alpha下yolov8文件夹中直接拷贝,如图所示:

资源文件中文件是从TensorRT-Alpha下common文件夹中直接拷贝过来。
(4)CUDA相关设置
通过项目的生成依赖项->生成自定义 选择CUDA ,如下图所示。


选择.cu文件,右键选择属性,项类型选CUDA C/C++。有可能出现问题:项类型缺少选项CUDA C/C++,解决方法见最下方问题记录。


(5)设置预编译头


4.生成解决方案
最后点击生成解决方案,若上述设置都是在Debug模式下,则在Debug模式下生成解决方案,在debug文件路径下生成dll,和lib库文件。同样地,在Release模式下设置、生成,则在Release文件路径下生成dll,和lib库文件。


问题记录
1. 显示“无法打开windows.h文件”,我的Windows.h 文件中有乱码,可能是加密系统导致的
1.1 在“Visual Studio Installer”修改:

1.2 在使用C++桌面开发里将Windows 10 SDK勾上(勾上一个版本应该就可以了)

1.3 在项目==>属性 里,更改Windows SDK版本即可

2. CUDA设置时:项类型缺少选项CUDA C/C++
2.1 关闭vs2019(如果已经打开)
2.2 检查CUDA安装路径C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.5\extras\visual_studio_integration\CudaProjectVsWizards下,是否存在VS集成扩展支持

这里15对应Visual Studio 2017,16对应Visual Studio 2019,17对应Visual Studio 2022,如果不存在相应扩展,请参照1.3获取
1.3 运行cuda_12.5.0_555.85_windows.exewindows安装包,它首先会解压cuda,在解压路径cuda12.5\visual_studio_integration\CUDAVisualStudioIntegration\extras\visual_studio_integration\CudaProjectVsWizards下有3个文件夹,就是1.2需要的VS扩展支持
1.4 将对应VS2019的16文件夹下内容拷贝到C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions下的NVIDIA\CUDA 12.5 Wizards\12.5中

注意: 上述三级文件夹NVIDIA\CUDA 12.5 Wizards\12.5可能需要手动创建,另外相依文件也可以不直接拷贝,而是通过创建链接的方式来进行(没有尝试该方法)
mklink /d "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\NVIDIA\CUDA 12.5 Wizards\12.5" "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.5\extras\visual_studio_integration\CudaProjectVsWizards\16"
这个命令的作用是,对C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.5\extras\visual_studio_integration\CudaProjectVsWizards下的16文件夹创建一个符号链接(类似创建快捷方式),创建的符号链接位于第一步中新建的CUDA 112.5 Wizards文件夹,该符号链接名为12.5:

1.5 Ctrl+S打开搜索框,找到Developer Command Prompt for VS 2019,右键,选择以管理员方式运行,运行以下命令:devenv.com /setup /nosetupvstemplates


1.6 将C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.5\extras\visual_studio_integration\MSBuildExtensions中文件拷贝到C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\v160\BuildCustomizations中
1.7 重启Visual Studio 2019,这样在封装dll步骤CUDA相关设置时,项类型中出现CUDA C/C++选项。
3. 生成解决方案时的报错

关于 C4996: 'localtime'、'getenv' 等不安全函数报错
原因:
Visual Studio 默认启用了「安全函数检查」,认为 localtime()、getenv() 等旧函数“不安全”。
解决方法:
在项目属性里定义 _CRT_SECURE_NO_WARNINGS
- 右键项目 → 属性
- 选择「C/C++ → 预处理器」
- 在 “预处理器定义” 中加上 _CRT_SECURE_NO_WARNINGS
- 确认后重新编译。


287

被折叠的 条评论
为什么被折叠?



