MASM调用C/C++ printf函数出现链接错误,需添加正确includelib?
解决MASM调用printf的LNK2019链接错误
问题根源
printf是C标准库函数,并不在kernel32.lib中,而是属于微软的**通用C运行时(UCRT)和VC运行时(VCRuntime)**组件,你当前的代码只链接了kernel32.lib,导致链接器找不到printf的定义。
解决方案
1. 修改汇编代码,添加必要的库引用
在原代码的includelib kernel32.lib下方,添加两个运行时库的引用:
; Test Call C++ Function printf() ; testPrintf.asm option casemap:none ; Establish case sensitivity for compatibility with C/C++ includelib kernel32.lib includelib ucrt.lib ; 通用C运行时库,包含printf等标准函数 includelib vcruntime.lib; VC运行时库,提供C运行时的基础支持 nl = 10 ; ASCII code for newline .data prtStr byte "Hello, World!", nl, 0 .code externdef printf:proc ; External declaration for C/C++ printf() function public asmMain asmMain proc sub rsp, 56 ; 预留影子寄存器空间并保证栈16字节对齐 lea rcx, prtStr call printf add rsp, 56 ; 恢复栈指针 ret asmMain endp end
2. 保留原链接命令或补充库参数
你之前的链接命令可以直接使用,因为代码里已经通过includelib指定了库。如果不想修改代码,也可以在链接命令中添加库参数:
ml64 testPrintf.asm /link /subsystem:console /entry:asmMain /DEFAULTLIB:ucrt.lib /DEFAULTLIB:vcruntime.lib
额外说明
externdef printf:proc的声明是正确的,option casemap:none保证了大小写敏感,和C标准库的printf名称匹配。- 栈操作
sub rsp, 56是合理的:x64调用约定要求为前4个参数(RCX/RDX/R8/R9)预留32字节的影子空间,同时栈必须保持16字节对齐,sub rsp,56既满足了影子空间需求,也保证了调用printf时栈的对齐状态。
内容的提问来源于stack exchange,提问作者Shadetree Sam
相关产品推荐
相关产品推荐

