MASM汇编+C++项目出现LNK2019未解析外部符号错误求助
解决MASM与C混合编程的LNK2019链接错误
问题概述
MASM汇编代码与C代码混合编译时,出现LNK2019未解析外部符号错误,涉及printf和asmScanf函数。已尝试将ASM文件项类型设为MASM、添加自定义依赖、链接器指定main,但问题仍存在。
相关代码
C代码
#include <stdio.h> #include <stdlib.h> #include <string.h> extern "C" { void asmMain(void); int asmScanf(char* dest, int maxLen); } int asmScanf(char* dest, int maxLen) { char* result = fgets(dest, maxLen, stdin); if (result != NULL) { int len = strlen(result); if (len > 0) { dest[len - 1] = 0; } return len; } return 0; // 修正:NULL为指针类型,返回int应改为0 } void clrscr(void) { system("cls"); } int main(void) { clrscr(); printf("Start asemblerskog programa:\n"); // 修正:原代码%s缺少对应参数 asmMain(); printf("Kraj asemblerskog programa.\n"); return 0; }
MASM汇编代码
.const option casemap:none NULL equ 0 noviRed equ 10 maxDuzina equ 256 .data decBroj db "Decimalni broj: ", 0 unosBroj db "Uneseni broj u decimalnom obliku: %s", noviRed, 0 hexBroj db noviRed, "Uneseni broj u heksadecimalnom obliku: %X", noviRed, 0 unos db maxDuzina dup(?) broj dd 0 .code externdef printf:proc externdef asmScanf:proc externdef atoi:proc public asmMain asmMain proc push rbp mov rbp, rsp sub rsp, 8 ; x64调用约定要求栈16字节对齐 ; 打印输入提示 lea rcx, decBroj call printf ; 调用asmScanf读取输入 lea rcx, unos mov rdx, maxDuzina call asmScanf ; 打印输入的十进制字符串 lea rcx, unosBroj lea rdx, unos call printf ; 字符串转整数 lea rcx, unos call atoi mov dword ptr [broj], eax ; 打印十六进制值 lea rcx, hexBroj mov rdx, [broj] ; x64下第二个参数存入rdx call printf add rsp, 8 mov rsp, rbp pop rbp xor eax, eax ret ; 修正:移除call exit,返回至C的main函数 asmMain endp end
错误信息
Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol printf referenced in function asmMain Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol asmScanf referenced in function asmMain
解决方案
1. 切换项目平台为x64
汇编代码使用了rbp、rcx等x64寄存器,必须将项目平台设置为x64:
- Visual Studio工具栏中,将平台从"Win32"切换为"x64";
- 若无x64选项,点击"配置管理器"→新建→选择x64平台。
2. 验证文件编译配置
- 右键ASM文件→属性→常规→项类型,确认选择Microsoft Macro Assembler;
- 右键C文件→属性→常规→项类型,确认选择C/C++编译器;
- 确保两个文件都在项目中,未被排除。
3. 检查链接器运行时库设置
项目属性→链接器→输入→附加依赖项:无需手动添加内容,默认会自动链接C运行时库;若之前修改过,重置为默认值。
4. 清理并重建项目
- 点击"生成"→"清理解决方案";
- 再点击"生成解决方案",清除旧编译缓存。
内容的提问来源于stack exchange,提问作者edodoe
相关产品推荐
相关产品推荐

