Windows环境下如何使用clang自带链接器完成汇编代码链接
Windows环境下Clang完整编译链接方案
- 单步执行命令,自动完成汇编+链接:
clang my.s -fuse-ld=lld -target x86_64-pc-windows-msvc -L"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x64" -o my.exe /ENTRY:main - 参数说明:
-fuse-ld=lld强制调用Clang自带的LLD链接器,避免默认调用MSVC的link.exe-target x86_64-pc-windows-msvc指定目标为64位Windows MSVC平台,匹配你当前汇编代码的COFF格式和Kernel32.lib的格式- 你的汇编代码中已经通过
.drectve段指定了/DEFAULTLIB:kernel32.lib,无需额外手动链接kernel32库
Linux交叉编译Windows可执行文件方案
你之前的报错是因为x86_64-windows-gnu目标默认会链接MinGW运行时库,你没有对应依赖导致报错,添加-nostdlib参数跳过默认库链接即可:
clang my.s --target=x86_64-windows-gnu -fuse-ld=lld "-L/run/media/eric/win10/Program Files (x86)/Windows Kits/10/Lib/10.0.20348.0/um/x64/" -lkernel32 -nostdlib -Wl,--entry=main -o my.exe
- 额外参数说明:
-nostdlib跳过C运行时等默认库的链接,你直接调用Windows系统API无需这些依赖-Wl,--entry=main给链接器传递入口点参数,指定main为程序入口-lkernel32手动链接Kernel32.lib,交叉编译场景下.drectve段的默认库声明不会自动生效,需手动指定
常见错误排查
如果仍然出现unknown file type报错,先检查目标文件格式:
- Windows环境执行
file my.o,输出应为COFF object file x86-64, for MS Windows - 如果输出为ELF格式,说明汇编阶段没有指定正确target,编译目标文件时需添加参数:
clang -c my.s --target=x86_64-pc-windows-msvc
内容的提问来源于stack exchange,提问作者Eric Stotch
相关产品推荐
相关产品推荐

