Joe*_*Joe 2 c++ linker-errors visual-c++ visual-studio-2022
编辑:只是为了结束,这个问题原来是由于链接器中的错误造成的。微软在版本 17.4.3 中修复了该问题
我刚刚将 Visual Studio 实例从 17.3.6 更新到 17.4.0。然后我尝试了一个干净的解决方案构建。突然我的一个项目给了我链接器错误
8>pch.obj : error LNK2001: unresolved external symbol __imp___tls_index_?init@?1??lazy_init_num_threads@internal@at@@YAXXZ@4_NA
8>pch.obj : error LNK2001: unresolved external symbol __imp___tls_offset_?init@?1??lazy_init_num_threads@internal@at@@YAXXZ@4_NA
8>C:\Users\jmole\Documents\Dev\Main\Solutions\..\Mobile\x64\Debug\net6.0-windows\mld_v143.dll : fatal error LNK1120: 2 unresolved externals
Run Code Online (Sandbox Code Playgroud)
这让我完全困惑。当我打开详细链接时,我看到它在 MSVCRTD.lib 中找到各种类似的符号。例如。
2> Found _tls_index
2> Found __dyn_tls_init
Run Code Online (Sandbox Code Playgroud)
还有其他人遇到过这种情况吗?
小智 7
转到 python 环境中的文件并通过删除仅保留声明\Lib\site-packages\torch\include\ATen\Parallel.h的内联实现来编辑它。at::internal::lazy_init_num_threads()这将强制您的构建使用非内联导入。问题很可能出在 VS C++ 处理具有静态变量的内联导出的方式上——在本例中是thread_local一个。
当然,完美的解决方案是与您的扩展一起重建 pytorch(就像任何 C++ DLL“导出”类的情况一样,而无需真正关心以安全的 ABI 兼容方式进行操作),但是在这里修补包含文件也可以,它只会阻止编译器内联 API 并创建对thread_local稍后链接步骤失败的局部静态变量的引用。然后,编译器将使用 pytorch DLL 中的非内联变体,并且链接器错误将被消除。