MSYS2下MinGW64库:ld找不到符号但lld可行,原因是什么?
MSYS2中ld链接LLVM库失败、lld成功的原因
在MSYS2的MinGW64环境下,用GNU ld链接LLVM 16预编译库时出现undefined reference to 'llvm::errs()'错误,换用lld就能成功链接,核心原因如下:
LLVM库对lld适配性更强:LLVM官方预编译库在MinGW环境下是针对自家的lld链接器优化构建的。GNU ld对符号依赖顺序要求严苛,当库间依赖关系复杂时,若链接参数里的库顺序不合理就会触发未定义引用;而lld的符号解析逻辑更灵活,能自动处理这类顺序问题,同时对LLVM库使用的COFF格式扩展特性支持更完善。
工具链适配细节差异:MSYS2中的llvm包是基于LLVM工具链构建的,默认适配lld。GNU ld作为GCC工具链的默认链接器,和LLVM编译的库在ABI细节、符号修饰规则上存在细微差异,导致部分符号无法被GNU ld正确识别。
你可以用以下命令验证库中是否存在目标符号,确认是链接器解析逻辑问题:
nm -D /mingw64/lib/libLLVM-16.dll | grep errs
内容的提问来源于stack exchange,提问作者user541686
相关产品推荐
相关产品推荐

