c++ 更新到Visual Studio 17.4.0会产生与TLS相关的链接器错误

whlutmcx  于 2022-11-19  发布在  其他
关注(0)|答案(3)|浏览(361)

我刚刚将我的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

还有其他人遇到过吗?

wb1gzix0

wb1gzix01#

名称mangling似乎指向at::internal::lazy_init_num_threads,这是一个PyTorch函数(有点奇怪,但它很可能使用线程本地存储)。

gojuced7

gojuced72#

转到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中的非内联变量,链接器错误将被消除。

wbrvyc0a

wbrvyc0a3#

更新到17.4后,请在平台工具集中切换到LLVM for Visual Studio 2022,以避免链接时出现此类错误。
PS:适用于Visual Studio 2017、2019和2022的LLVM:Visual-Studio-llvm-utils

相关问题