Windows10环境下VS2019编译libtorch后抛出c10::error异常问题
Windows平台自定义编译libtorch启动崩溃(jit_type.h相关c10::Error异常)解决方案
问题复现场景
在Windows 10系统上使用VS 2019编译不含CUDA、Python依赖的libtorch库,无论是否启用MKL,测试程序启动即崩溃。Debug版本调试可定位到torch_cpu.dll的torchCheckFail函数抛出c10::Error异常,报错指向ATen/core/jit_type.h文件。使用官方预编译二进制包无此问题。
触发异常的代码片段
void torchCheckFail( const char* func, const char* file, uint32_t line, const std::string& msg) { throw ::c10::Error({func, file, line}, msg); }
异常调用栈

解决方案
按优先级依次排查以下配置项:
- 运行库选项必须完全匹配:编译libtorch时选择的运行库(
/MD//MDd//MT//MTd)必须和测试程序的运行库选项完全一致。官方预编译包默认使用/MD(Release)和/MDd(Debug)配置,若自行编译时切换为/MT系列运行库,会导致跨模块堆内存管理不一致,触发JIT类型系统初始化阶段的断言失败。 - 迭代器调试级别配置匹配:Debug模式下VS默认
_ITERATOR_DEBUG_LEVEL=2,若编译libtorch时手动修改了该宏的取值,或者测试程序和libtorch的该宏取值不一致,会导致STL结构体内存布局不匹配,在ATen类型注册时触发检查失败。 - 关闭过度符号裁剪:编译时不要强制设置
CMAKE_CXX_VISIBILITY_PRESET=hidden,该配置会裁剪掉JIT类型系统依赖的全局符号,导致跨模块静态变量初始化失败。官方预编译包会强制导出所有公共符号,无该问题。 - 使用正式Release标签编译:不要直接编译开发分支的代码,建议选择和官方预编译包同版本的正式Release标签(如v1.13.1、v2.0.1等),编译前清空build目录避免缓存干扰。
参考编译命令(VS2019 x64 Release)
mkdir build && cd build cmake .. -G "Visual Studio 16 2019" -A x64 ^ -DBUILD_SHARED_LIBS=ON ^ -DCMAKE_BUILD_TYPE=Release ^ -DUSE_CUDA=OFF ^ -DUSE_PYTHON=OFF ^ -DUSE_MKL=ON ^ -DCMAKE_INSTALL_PREFIX=../output cmake --build . --config Release --target install
编译完成后使用同配置编译测试程序即可复现官方预编译包的运行效果。
内容的提问来源于stack exchange,提问作者Bastian
相关产品推荐
相关产品推荐

