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

VS2019含.asm与MASM的项目编译失败,求解决方法

VS2019 x64汇编+C++混合项目编译错误(MSB3721)排查与解决

问题背景

按以下步骤创建项目后编译报错:

  • 创建新项目→Windows桌面向导→使用默认名称
  • 选择控制台应用
  • 配置管理器切换为x64架构
  • 生成依赖项→生成自定义→勾选masm组件
  • 添加新项→创建汇编文件并命名为asm.asm

编译错误信息:

Build started...
1>------ Build started: Project: Project2, Configuration: Debug x64 ------
1>Assembling asm.asm...
1>D:\Visual\MSBuild\Microsoft\VC\v160\BuildCustomizations\masm.targets(70,5): error MSB3721: The command "ml64.exe /c /nologo /Zi /Fo"x64\Debug\asm.obj" /W3 /errorReport:prompt /Taasm.asm" exited with code 1.
1>Done building project "Project2.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

项目中C++代码:

#include <iostream>
using namespace std;
extern "C" __int64 sum(int a, int b);
int main(int argc, char* argv[])
{
    int a = 10;
    int b = 20;
    int c;
    c = sum(a, b);
    cout << "Sum = " << c << endl;
    system("PAUSE");
    return 0;
}

汇编代码:

.CODE
_DATA SEGMENT
_DATA ENDS
_TEXT SEGMENT
PUBLIC sum
suma PROC
    movsxd rax, ecx
    movsxd rdx, edx
    add rax, rdx
    ret
sum ENDP
_TEXT ENDS
END

错误原因

  1. 函数名不匹配:汇编中声明了PUBLIC sum,但实际定义的过程名是suma PROC,C++代码调用的是sum,导致链接器无法找到对应符号。
  2. 段定义冗余:.CODE等价于_TEXT SEGMENT,重复定义会引发汇编器解析冲突。

解决步骤

1. 修正汇编过程名

将suma PROC改为sum PROC,保证和声明的PUBLIC sum、C++中的调用名完全一致。

2. 规范汇编段定义

去掉冗余的.CODE或_TEXT SEGMENT,避免段重复定义。

3. 可选:类型匹配优化

C++中sum返回__int64,而变量c是int,小数值下无问题,但建议显式转换或调整类型保持一致:

  • 方法一:将int c;改为__int64 c;
  • 方法二:赋值时显式转换:c = static_cast<int>(sum(a, b));

修正后的汇编代码

_TEXT SEGMENT
PUBLIC sum
sum PROC
    movsxd rax, ecx  ; 将32位int扩展为64位寄存器rax
    movsxd rdx, edx  ; 将32位int扩展为64位寄存器rdx
    add rax, rdx     ; 执行64位加法
    ret
sum ENDP
_TEXT ENDS
END

验证效果

修改后重新生成项目,编译错误即可消除,程序运行会输出Sum = 30并暂停。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:15:25