错误汇总
- 1、由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题
- 2、LINK : fatal error LNK1104: cannot open file 'torch-NOTFOUND.obj' (torch-NOTFOUND.obj无法找到)
- 3、error C2440: “初始化”: 无法从“`torch::jit::script::Module`”转换为“`std::shared_ptr`”
- 4、无法定位程序输入点cudnnSetCTCLossDescriptorEx于动态链接库xxx.dll上
- 5、有未经处理的异常:Microsoft C++异常:c10::Error,位于内存位置xxx处
- 6、引发异常:0xC0000005:读取位置0xFFFFFFFFFFFFFFFE时发生访问冲突
- 7、error :c2872 std 不明确的符号
1、由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题
在运行VS时,有时会出现**“由于找不到xxx.dll,无法继续执行代码”**的报错。
这是由于当前执行程序无法找到这个动态库。这种情况可以大致分为两种以下两种:
(1)由于找不到c10.dll(或其他libtorch/lib中的.dll动态库),无法继续执行代码
这是因为执行程序无法找到libtorch/lib下的这些外部动态库,这些库并不是没有,而是程序无法找到他。最简单粗暴的解决方法就是将你之前下载的libtorch库的libtorch/lib文件夹中的对应.dll文件复制到你目前工程的Example\build\Release(或debug,取决于你是采用release还是debug模式)里,(说简单点就是和你当前工程编译后的可执行文件放在一起),缺什么补什么。
另外,我看网上还有一种做法,就是把libtorch/lib中的所有dll放到libtorch/bin中,然后把libtorch/bin加到环境变量的path中。这样让程序安装Path中的路径自己找到对应的动态库,我觉得这个方法应该是最科学有效的。但是我这么做了之后仍然出现了无法找到里面某些.dll文件的问题,所以不知道这个方法的正确操作方式应该是什么。
补充:目前找到了一个有效且简易的方法,就是在属性界面的 调试=>环境 里添加libtorch动态库的路径:
PATH=D:\Code_Lib\libtorch\lib;%PATH%
总而言之,就是需要让我们工程编译后的可执行文件在运行时能够找到需要的动态库,而VS如果采用隐式链接的方式链接动态库,则其搜索动态库的方法可以参考我另一篇文章:
让Visual Studio (VS)链接静态库(lib)及动态库(dll)文件的方法汇总
(2)由于找不到VCRUNTIME 140_1D.dll,无法继续执行代码
除了外部动态库,程序还需要一些windows系统自带的动态库,但有的时候也会出现找不到这些库的情况,这大概率是因为你的系统里就是没有这些库。
解决方法也很简单,只需要去https://www.dll-files.com/网站下载你缺少的dll动态库,得到该文件的压缩包,然后解压把该.dll文件复制到C:\Windows\System32目录下即可。
2、LINK : fatal error LNK1104: cannot open file ‘torch-NOTFOUND.obj’ (torch-NOTFOUND.obj无法找到)
大概率是因为下载的libtorch是release版本的, 却在debug下编译, 或者反之。
因此解决方法就是要用对应版本的libtorch进行对应方法的编译。
参考:
https://github.com/pytorch/pytorch/issues/24305
3、error C2440: “初始化”: 无法从“torch::jit::script::Module
”转换为“std::shared_ptr<torch::jit::script::Module>
”
如果采用网络上流行的libtorch测试代码:
#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>
int main() {
// Deserialize the ScriptModule from a file using torch::jit::load().
std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("D:/Desktop/pytorch1_0/model.pt");
assert(module != nullptr);
std::cout << "ok\n";
// Create a vector of inputs.
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::ones({ 1, 3, 224, 224 }));
// Execute the model and turn its output into a tensor.
at::Tensor output = module->forward(inputs).toTensor();
std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';
while (1);
}
在生成解决方案时,会报错: error C2440: “初始化”: 无法从“torch::jit::script::Module”转换为“std::shared_ptrtorch::jit::script::Module”
这是因为采用的Libtorch版本的问题。
std::shared_ptr是libtorch测试版本使用的变量类型,
而libtorch version1.2已经进行了修改:
因此,应将:
std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("../xxx.pt");
改为:
using torch::jit::script::Module;
Module module = torch::jit::load("../xxx.pt");
同时,module已经不再是指针,所以也需要将:
at::Tensor output = module->forward(inputs).toTensor();
改为:
at::Tensor output = module.forward(inputs).toTensor();
参考:
[1] : https://github.com/pytorch/pytorch/issues/22382
[2] : https://github.com/pytorch/pytorch/releases/tag/v1.2.0
[3] : https://blog.csdn.net/qq_33507306/article/details/104427134
4、无法定位程序输入点cudnnSetCTCLossDescriptorEx于动态链接库xxx.dll上
这个问题我没有找到解决方法,之前在CMake时是同时链接了libtorch库和OpenCV库。我去掉OpenCV库之后重新CMake了一遍就没再出现这个问题。
但是在同时链接这两个库的时候如何解决这个问题我暂时没有找到解决方法。
不过在上网查阅的时候,https://blog.csdn.net/wb175208/article/details/90479037提出了一个解决“无法定位程序输入点xxx于动态链接库xxx.dll上”的方法。
5、有未经处理的异常:Microsoft C++异常:c10::Error,位于内存位置xxx处
这个错误出现在用torch::jit::load加载.pt文件时,出现的内存错误。
如果出现这个报错大概率是因为用Python生成.pt文件时所采用的pytorch的版本和C++采用的Libtorch版本不一致导致的。致使C++的libtorch接口无法读取.pt文件。
解决方法就是采用相同版本的pytorch和libtorch。
------------------------------2020/12/30更新-----------------------------------
根据后续大家补充,出现c10::Error不止这一个原因。详情可见评论区。
但总的来说,出现c10::Error基本是由加载的.pt模型有问题造成的,包括但不限于:生成.pt模型的pytorch和libtorch版本不一致;.pt模型的挂载设备(CPU or CUDA)与C++中tensor挂载设备不一致;使用的libtorch支持的CUDA与计算机的CUDA不一致……(欢迎大家在评论区补充讨论)
参考:
[1] 使用vs2019编译 c++ libtorch 的 yolov5项目出现的问题,尤其是 Microsoft C++ 异常: c10::Error,位于内存位置 0x0000000D606FE350
------------------------------2021/4/25更新---------------------------------------
今天在调用一个新的模型时,也出现了与评论区很多人同样的问题:
在 torch::kCUDA 的前提下,model.forward()时没错,但接下来在toTensor()或toTuple()时报c10 error。
原因:与模型的返回值有关,类型转换与返回值不符。
具体对应关系如下:
模型返回Tensor , c++中用 toTensor()
模型返回list,c++中用 toList()
模型返回tuple, c++中用 toTuple()
参考:
[1] c++与libtorch混合编程:std:runtime_error及c10:error报错分析
6、引发异常:0xC0000005:读取位置0xFFFFFFFFFFFFFFFE时发生访问冲突
出现这个问题的原因和前面的“torch-NOTFOUND.obj无法找到”是一样的。也是因为下载的libtorch是release版本的, 却在debug下编译, 或者反之。
所以解决方法就是在release下编译release版本的libtorch,用debug编译debug版本的libtorch。
7、error :c2872 std 不明确的符号
我通过直接配置VS让项目连接libtorch和opencv库,而不是采用CMake的方式。在配置完包含目录、库目录、链接器附加依赖项后,在debug x64下编译项目。报了如下错误:
error:c2872 std 不明确的符号
解决方法:将 属性》C/C++》语言》符合模式 改为否,问题解决。