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

MASM汇编调用C语言scanf函数出现LNK2019链接错误的求助

问题原因与解决办法

核心问题

你遇到的LNK2019错误,本质是MSVC默认屏蔽了scanf这类未做安全校验的C标准库函数,链接器找不到对应的符号。而printf能正常工作,是因为MSVC没有对它做强制屏蔽,或者你的代码里的printf调用刚好符合默认规则。

具体解决步骤

方法1:解禁scanf(快速修复)

在你的c.cpp文件最顶部添加两个宏定义,告诉MSVC允许使用不安全的标准库函数:

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE

重新执行编译链接流程,scanf的符号就能被正常找到。

方法2:改用安全版本scanf_s(官方推荐)

MSVC主推安全增强的输入函数scanf_s,它比scanf多一个参数用于指定输入缓冲区的大小。修改你的汇编代码如下(以完整功能为例):

.data
    prompt db "请输入一个整数:", 0
    input_fmt db "%d", 0
    output_fmt db "你输入的整数是:%d", 0Ah, 0
    num dd ?

.code
    extern printf:proc
    extern scanf_s:proc

asm_01 proc
    ; 打印提示信息
    lea rcx, prompt
    call printf

    ; 调用scanf_s读取整数
    lea rcx, input_fmt
    lea rdx, num
    mov r8d, sizeof(num)  ; 传递整数变量的大小,用于安全校验
    call scanf_s

    ; 打印输入结果
    lea rcx, output_fmt
    mov rdx, num
    call printf

    ret
asm_01 endp
end

必做检查项

  • 确认汇编中scanf的声明正确:x64平台下MSVC的C函数名无前缀下划线,所以要用extern scanf:proc(如果用方法1),不要写成_scanf。
  • 编译链接命令要正确:
    1. 编译汇编生成目标文件:ml64.exe /c a.asm
    2. 链接C++与汇编文件:cl.exe c.cpp a.obj

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:00:07