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。 - 编译链接命令要正确:
- 编译汇编生成目标文件:
ml64.exe /c a.asm - 链接C++与汇编文件:
cl.exe c.cpp a.obj
- 编译汇编生成目标文件:
内容的提问来源于stack exchange,提问作者anbocode
相关产品推荐
相关产品推荐

