我刚刚将我的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
还有其他人遇到过吗?
3条答案
按热度按时间wb1gzix01#
名称mangling似乎指向
at::internal::lazy_init_num_threads
,这是一个PyTorch函数(有点奇怪,但它很可能使用线程本地存储)。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中的非内联变量,链接器错误将被消除。wbrvyc0a3#
更新到17.4后,请在平台工具集中切换到LLVM for Visual Studio 2022,以避免链接时出现此类错误。
PS:适用于Visual Studio 2017、2019和2022的LLVM:Visual-Studio-llvm-utils