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
相关产品推荐
相关产品推荐

