网上很多教程刚开始都让切release模式,博主最初因为没找到哪里切换,所以用的默认的debug模式。他们配置方法一样,其区别在于
-
Debug:调试版本,包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试。Debug模式下生成两个文件,除了.exe或.dll文件外,还有一个.pdb文件,该文件记录了代码中断点等调试信息
-
Release:发布版本,不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小和运行速度上都是最优的。(调试信息可在单独的PDB文件中生成)。 Release模式下生成一个文件.exe或.dll文件。
具体有兴趣的可以进一步查阅资料。
图里可以看到debug模式下代码正常,切换到release之后如图:
因为release模式下,opencv并未配置。所以这里博主重新配置一遍release模式下的过程。
主要是一下三个操作步骤:
右键项目点击【属性】进入一下页面:
一 、opencv配置
1.1、opencv下载
下载地址:opencv
这里博主下载的是【Windows】版本,【Sources】版本是源码安装,可以参考博主另一篇博文win下C++部署深度学习模型之clion配置pytorch+opencv教程记录。
1.2、【VC++目录→包含目录】
点击编辑
【新行】→【…】
定位到D:\opencv-4.8.0-windows\opencv\build\include
后点击确定。
添加玩之后如图所示:
1.3、【VC++目录→库目录】
操作和1中类似,区别在于添加的目录地址不一样。
定位到D:\opencv-4.8.0-windows\opencv\build\x64\vc16\lib
点击确定。
1.4、【链接器→输入→附加依赖项】
需要添加opencv_world480.lib
文件的绝对路径地址即D:\opencv-4.8.0-windows\opencv\build\x64\vc16\lib\opencv_world480.lib
。此处大家根据自己的实际路径填写**\opencv\build\x64\vc16\lib\opencv_world480.lib
。
划重点
图里有两个类似的文件opencv_world480.lib
和opencv_world480d.lib
。网上很多教程,有的这里添加的是前者有的是后者。博主被这个坑惨了,这里分享给大家避免踩雷。下图可以看到博主此时是在release模式下,所以对应选择opencv_world480.lib
;如果是debug,则应该选择opencv_world480d.lib
。否则不匹配将会发生如下错误:
这个问题如果排查起来很折磨人!
正确配置好后如下所示:
1.5、测试运行
配置完成后点击项目下【源文件】,右键【添加】→【信件项】后按下图所示新建一个cpp文件,自定义取名。
输入以下测试代码:
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std; // c++标准库中所有标识符都被定义于一个名为std的namespace中
using namespace cv;
int main()
{
//这里给出自定义目录图片目录
Mat img = imread("E:/6.jpg");
if (img.empty())
{
cout << "该图片读取有问题" << endl;
return 0;
}
imshow("test", img);
waitKey(0);
return 0;
}
再点击下图任一按钮即可运行程序。
二、libtorch配置
2.1、 libtorch下载
下载地址:libtorch官方下载地址
注意上图中标注的几项,cuda版本向下兼容,选择适配自己环境的release版本进行下载。
2.2、【VC++目录→包含目录】
此处同理opencv配置,定位到2.1中下载的D:\libtorch-cu121\libtorch\include
和“D:\libtorch-cu121\libtorch\include\torch\csrc\api\include”目录进行添加。
添加之后如图所示:
2.3、【VC++目录→库目录】
同理opencv 【2.3】定位到D:\libtorch-cu121\libtorch\lib
进行添加。
2.4、【链接器→输入→附加依赖项】
定位到下图所示目录:
有两种方式可以添加:
方法一
将目录D:\libtorch-cu121\libtorch\lib
路径下的所有lib
文件添加到该位置,不同版本有不同的.lib
文件,这里建议可以将其先存为一个TXT文件,方便后续出错后修改。
方法二
给出绝对路径地址+“*.lib”即可。
博主这里即为:D:\libtorch-cu121\libtorch\lib\*.lib
2.5、【配置属性】→【调试】→【环境】
按照上述配置后,进行测试,发生报错:“无法定位程序输入点?check_range@Symlnt@c10@@ .exe或是.dll”
解决方法:在调试——环境中设置lib文件夹里的DLL文件的环境变量。
编辑【环境】为PATH=D:\libtorch-cu121\libtorch\lib;%PATH%
2.6、试运行
输入以下代码进行测试:
#include <iostream>
#include <torch/torch.h>
#include<torch/script.h>
using namespace std;
int main()
{
cout << "cuda是否可用:" << torch::cuda::is_available() << endl;
cout << "cudnn是否可用:" << torch::cuda::cudnn_is_available() << endl;
cout << torch::cuda::device_count() << endl;
torch::Tensor tr = torch::arange(0, 9, torch::kFloat32).reshape({ 3,3 });
cout << tr << endl;
return 0;
}
如果程序返回结果都为非0,那证明CUDA以及CUDNN都是可用的,自此环境已经搭建完成,但是也有可能返回结果为0证明CUDA以及CUDNN都不可用。需要进行CUDA的配置命令:
【属性】→【命令行】,输入:
/INCLUDE:"?ignore_this_library_placeholder@@YAHXZ"
成功运行:
注意这里不同版本libtorch对应命令不一,博主是用的cuda12.1对应的libtorch,即LibTorch1.13.1版本。更早版本的可以参考以下命令:
libtorch1.8.1/cuda10:
/INCLUDE:?warp_size@cuda@at@@YAHXZ
libtorch1.9.0/cuda11:
/INCLUDE:"?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z
libtorch1.10.2+cu113:
/INCLUDE:?warp_size@cuda@at@@YAHXZ -INCLUDE:?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z
三、BUG记录
3.1、 #error You need C++17 to compile PyTorch
这个错误导致程序直接无法运行,搜了下原因
- libtorch (PyTorch C++)根据系统(Win/Mac/Linux)和GPU/CUDA(version) 选择install 之后就可通过Cmake find_package 直接使用,但是默认编译libtorch 为 C++14,如果和其他 C++17 编译得到的库共同链接到项目,就可能产生一系列问题:如下图,原因是先链接 C++14 编译的torch,会将编译设为 C++14,再去链接C++17的库,就无法识别C17加入标准库的内容,编译报错。
网上很多教程都没用,最后我是从版本入手,想着直接修改C++版本,最后成功解决,而且极为简单。
【常规】→【C++语言标准】,初次打开是默认的C++14,这里改为C++17即可。
3.2、“LNK 200:/INCLUDE:?warp_size@cuda@at@@YAHXZ -INCLUDE:?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z 未识别的指令”
这个就是cuda配置的时候添加了和版本不适配的命令,按照【2.5】种cuda配置进行修改即可。
3.3、 “#error std 不明确的符号”
把《符合模式》改为否;
3.4、由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题
2种方法可以解决。
- 方法1:将缺失的.dll文件拷贝到工程目录里,即“当前工程的Example\build\Release(或debug,取决于你是采用release还是debug模式)”里,或者说放置在工程编译后的可执行文件同一目录下。
- 方法2:即【2.5】中的方法,直接在【配置属性】→【调试】→【环境】中添加添加libtorch动态库的路径
PATH=**\libtorch-cu121\libtorch\lib;%PATH%
3.5 由于找不到VCRUNTIME 140_1D.dll,无法继续执行代码
除了外部动态库,程序还需要一些windows系统自带的动态库,但有的时候也会出现找不到这些库的情况,这大概率是因为你的系统里就是没有这些库。
解决方法也很简单,只需要去https://www.dll-files.com/网站下载你缺少的dll动态库,得到该文件的压缩包,然后解压把该.dll文件复制到C:\Windows\System32目录下即可。
更多BUG可以参考BUG文章来源:https://www.toymoban.com/news/detail-853941.html
终于结束。踩雷无数,在解决问题中进步吧。文章来源地址https://www.toymoban.com/news/detail-853941.html
到了这里,关于vs配置opencv和libtorch(cuda12.0)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!