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
相关产品推荐
相关产品推荐

