You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:52:39