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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:05:01