clang-cl自定义CRT使用/NODEFAULTLIB时__tls_index未定义符号报错
问题根因
- clang-cl 面向 Windows 平台编译时,默认生成的 TLS 索引引用符号名为双下划线前缀的
__tls_index,你在 crt.cpp 中定义的是单下划线前缀的_tls_index,二者符号名不匹配,因此链接时报未定义错误。 - MSVC 原生编译器的 TLS 索引符号命名本身就是单下划线的
_tls_index,所以相同代码在 MSVC 工具链下可以正常链接。
修复方案
任选以下一种即可:
- 修改 crt.cpp 中的符号定义,通过条件编译兼容两种工具链:
extern "C" { #ifdef __clang__ uint32_t __tls_index{}; #else uint32_t _tls_index{}; #endif }
- 给 clang-cl 额外添加编译选项
/fms-compatibility-tls-index,该参数会强制 clang-cl 使用和 MSVC 一致的单下划线_tls_index作为 TLS 索引符号名,无需修改现有代码。 - 如果你开启了链接时优化(LTO),需要确保上述配置同时应用到编译、链接两个阶段,避免 LTO 阶段符号处理逻辑不一致导致问题复现。
内容的提问来源于stack exchange,提问作者f4rw3llvv
相关产品推荐
相关产品推荐

