解决:Darknet编译时报MSB3721错误

错误描述

我在使用 VS 2015 编译 darknet 项目时报如下错误:

错误

Github相关 issues: darknet build error MSB3721

尝试解决

1. 修改 darknet.vcxproj 文件中 Code Generation 的值,即 compute_75,sm_75 (未解决)

按在网上找到解决方法 VS2015配置darknet项目时遇到MSB3721的解决办法 尝试解决。

  1. 修改 darknet.vcxproj 文件中的两处 Code Generation,将 compute_86,sm_86(网上说的compute_75,sm_75,我这里是 compute_86,sm_86) 修改为 compute_52,sm_52; 修改后完整的值为 compute_30,sm_30;compute_52,sm_52

删除前

这里的 compute_52,sm_52 是经过计算得出来的值,可能每个用户的显卡不一样,值也不一样,我的显卡是 GTX 1050Ti,这里用 “52”,其他型号的显卡请查看英伟达的GPU算力表,地址是:https://developer.nvidia.com/zh-cn/cuda-gpus#compute

  1. 在 VS 2015 的 “darknet 属性页” 窗口中,修改 Code Generation 的值为 compute_30,sm_30;compute_52,sm_52

修改Code Generation

  1. 在 VS 2015 中重新生成 darknet,发现还是 生成失败,还是报 MSB 3721 错误

2. 删除 Code Generation 中的 compute_75,sm_75(未解决)

  1. 编辑 darknet.vcxproj,将 Code Generation 中的 compute_75,sm_75 删掉;
  2. 同样的,在 VS 2015 的 “darknet 属性页” 窗口中,将 compute_75,sm_75 删掉;
  3. 在 VS 2015 中重新生成 darknet,发现还是 生成失败,还是报 MSB 3721 错误

3. 删除 Code Generation 选项(未解决)

编辑 darknet.vcxproj 文件,删除 Code Generation 这项参数,注意的是删除后, darknet 会默认设置该参数值为 compute_52,sm_52,这个在重新生成 darknet 后代码输出中可看到。

重新生成 darknet,发现还是 生成失败,还是报 MSB 3721 错误

4. 修改 OpenCV 版本为 3.4.14(未解决)

OpenCV 官网下载页 下载 “3.4.14” 版本后,重新部署,然后重新生成 darknet,发现还是 生成失败,还是报 MSB 3721 错误

5. 重新安装 CUDA(未解决)

重新安装 CUDA 后,再次重新生成 darknet,发现还是 生成失败,还是报 MSB 3721 错误

不过在重装 CUDA 过程中,NVIDIA Installer 提示 “Nsight for Visual Studio 2019 will not be installed,Nsight for Visual Studio 2017 will not be installed” 之类的信息让我有了思路:我要不安装个 VS 2019 试试?

6. 安装 Visual Studio 2019,使用其编译(已解决)

安装 Visual Studio 2019 完成后,重新解压 darknet-master.zip ,基于这份未做任何修改的代码做测试。按照之前的配置流程,修改 darknet.vcxproj 中 CUDA 版本,在 VS 2019 中配置 OpenCV。。。具体的可看我的另一篇描述搭建的文章 Windows 10搭建基于Darknet的 Yolov4目标检测平台,在 VS 2019 中,项目属性如下图:

darknet属性页

配置完成后,重新生成 darknet,这次竟然没任何报错,成功编译了!

编译成功

x64 目录下也生成了 darknet.exe 可执行文件:

生成darknet.exe

经过测试,发现没问题。至此,我的问题已解决。

总结

  1. 出现 MSB 3721 错误后,务必在 VS 2015/2017/2019 中检查 darknet 项目配置是否正确,配置的包含目录、库目录、引用库文件名等是否都存在,相关的环境变量是否配置好,有时引发错误的可能就是这些配置不正确导致的;
  2. 升级 CUDA 至最新版本,并使用相应版本的 cuDNN;
  3. 根据显卡算力,修改 darknet.vcxproj 中的 Code Generation 值,毕竟也有人使用这个方法解决的;
  4. 使用 VS 2017或 VS 2019 来编译 darknet

每个人环境不一样,导致错误的问题也不一样,只有不断尝试各种方法、不断排错,才能找到问题的解决方案。具体项目具体分析,有时网上很多资料都是直接转载别人的内容,并不适合所有人,希望这篇文章能帮助到你们。

参考文档

  1. Compiling with GPU on windows 10
  2. https://github.com/AlexeyAB/darknet
  3. windows下darknet之yolo(gpu版本)安装
  4. VS2015配置darknet项目时遇到MSB3721的解决办法