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

VS2022下ARM64汇编引用C++全局数组指针遇链接与语法错误

问题解决方案

错误1:LNK2001 未解析外部符号gVals

原因:Windows ARM64平台下,extern "C"声明的全局变量会被编译器添加下划线前缀(符号名变为_gVals),汇编代码中直接引用gVals会导致链接器无法匹配符号。
解决:将汇编中的EXTERN gVals改为EXTERN _gVals,所有引用该变量的地方统一替换为_gVals。

错误2:A2173 表达式语法错误(:lo12:gVals)

原因::lo12:是GNU汇编(GAS)的语法,VS2022使用的ARM64 MASM(marmasm)不支持该写法,MASM中获取符号低12位偏移的正确语法是LO12(符号名)。
解决:将add x0, x0, :lo12:gVals改为add x0, x0, LO12(_gVals)。

修正后的完整汇编代码

AREA |.text|,CODE,READONLY

EXTERN _gVals

test_asm_func PROC
    adrp    x0, _gVals
    add     x0, x0, LO12(_gVals)
    ret
test_asm_func ENDP

END

额外验证点

  • 确保C++代码中存在gVals的实际定义:在某.cpp文件中添加ULONG_PTR gVals[0x100];,仅声明会再次触发LNK2001。
  • 确认项目已切换至ARM64目标平台,且marmasm构建自定义已正确启用(汇编文件的“项类型”需设置为“Microsoft Macro Assembler”)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:33:17