提问人:Joe 提问时间:11/9/2022 最后编辑:Joe 更新时间:12/29/2022 访问量:3311
更新到 Visual Studio 17.4.0 会产生与 TLS 相关的链接器错误
Updating to Visual Studio 17.4.0 Yields linker errors related to TLS
问:
编辑:只是为了关闭,这个问题原来是由于链接器中的错误造成的。Microsoft 在版本 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
这完全让我感到困惑。当我打开详细链接时,我看到它在 MSVCRTD.lib 中找到各种相似的符号。例如。
2> Found _tls_index
2> Found __dyn_tls_init
还有其他人遇到过这种情况吗?
答:
更新到 17.4 后,请在平台工具集中切换到 LLVM for Visual Studio 2022,以避免链接时出现此类错误。
附言: 适用于 Visual Studio 2017、2019 和 2022 的 LLVM:Visual-Studio-llvm-utils
评论
名称 mangling 似乎指向 ,这是一个 PyTorch 函数(有点奇怪,但它很可能使用线程本地存储)。您可能需要使用相同的工具链重新构建 PyTorchat::internal::lazy_init_num_threads
评论
转到 python 环境中的文件,并通过删除仅保留声明的内联实现来编辑它。这将强制生成使用非内联导入。
问题很可能出在 VS C++ 处理具有静态变量的内联导出的方式上 - 在本例中为一个。\Lib\site-packages\torch\include\ATen\Parallel.h
at::internal::lazy_init_num_threads()
thread_local
当然,完美的解决方案是与您的扩展一起重建 pytorch(就像任何 C++ DLL“导出”类一样,而没有真正关心以安全的 ABI 兼容方式进行),但修补包含文件在这里也是可以的,它只会阻止编译器内联 API 并创建对稍后链接失败的局部静态变量的引用。然后,编译器将使用 pytorch DLL 中的非内联变体,链接器错误将被消除。thread_local
评论
C:\Users\<username>\AppData\Roaming\Python\Python39\site-packages\torch\include\ATen\Parallel.h
inline TORCH_API void lazy_init_num_threads() {
}
TORCH_API void lazy_init_num_threads();
评论
__imp___tls_index_
莫。您的项目似乎错误地在使用动态或静态 C 运行时之间切换,并且应该在这些错误之前在日志中引发相应的警告。_tls_index