You need to enable JavaScript to run this app. Windows平台LLVM编译__chkstk未定义报错及定义位置、链接方案问询
优惠活动
大模型
产品
解决方案
定价
更多

Windows平台LLVM编译__chkstk未定义报错及定义位置、链接方案问询

__chkstk 链接错误解决方案

1. __chkstk 所属的库文件

针对你使用的x86_64-pc-windows-msvc目标,__chkstk有两个合法的来源:

  • MSVC 运行时库:动态CRT对应的导入库是msvcrt.lib/vcruntime.lib,静态CRT对应的库是libcmt.lib,调试版本对应msvcrtd.lib/libcmtd.lib,__chkstk的实现默认包含在这些库中
  • LLVM 内置运行时库:LLVM自带的clang_rt.builtins-x86_64.lib库也提供了__chkstk的独立实现,不需要依赖MSVC CRT即可使用

2. clang 默认添加的链接逻辑

你直接执行clang hello.c -o hello.exe没有报错,是因为clang默认做了以下处理:

  • 自动检索MSVC CRT、Windows SDK的库路径,默认将对应版本的CRT库、系统基础库(如kernel32.lib)加入链接列表
  • 不会添加/entry:main参数,默认使用CRT提供的mainCRTStartup作为程序入口,该入口会完成CRT初始化后再调用你编写的main函数
  • 如果是使用非MSVC目标场景,clang会自动链接内置的clang_rt.builtins库,提供__chkstk等编译器内置函数的实现

3. 解决链接错误的可行方案

方案1:依赖MSVC CRT的场景

如果你需要使用MSVC CRT,只需要在手动链接时删除/entry:main参数,同时添加对应的CRT库和系统基础库即可:

lld-link /out:hello.exe hello.obj msvcrt.lib vcruntime.lib ucrt.lib kernel32.lib

如果需要静态链接CRT,将msvcrt.lib替换为libcmt.lib即可;调试版本替换为对应带d后缀的库名。

方案2:不依赖MSVC CRT、自定义入口的场景

如果你需要保留/entry:main的自定义入口配置,不想依赖完整MSVC CRT,可以手动链接LLVM内置的运行时库:
首先找到你的LLVM安装路径下的lib/clang/<你的clang版本号>/lib/windows目录,将其中的clang_rt.builtins-x86_64.lib加入链接参数即可:

lld-link /out:hello.exe /entry:main hello.obj "C:\Program Files\LLVM\lib\clang\12.0.1\lib\windows\clang_rt.builtins-x86_64.lib" kernel32.lib

内容的提问来源于stack exchange,提问作者LadyCailin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 05:30:04