VS2022 x64环境下链接器无法找到汇编符号StubCode的问题
问题解决方法
核心原因
C编译器会对函数名进行名字修饰(Name Mangling),而你汇编代码中导出的是未修饰的StubCode符号,导致链接器无法匹配C代码中被修饰过的函数符号。另外,x64平台下Windows只有一种调用约定(Microsoft x64调用约定),__cdecl/__stdcall这类关键字在x64下会被编译器忽略,所以更换调用约定无法解决问题。
具体修复方案
方案1:在C++代码中用extern "C"禁用名字修饰
修改C++代码,通过extern "C"声明汇编函数,让编译器生成未修饰的符号名,和汇编导出的符号完全匹配:
extern "C" __int64 StubCode(); int main() { __int64 n = StubCode(); return 0; }
方案2:汇编代码中使用C++风格修饰名导出(不推荐)
如果坚持不用extern "C",可以在汇编中导出C修饰后的函数名。x64下C对__int64 StubCode(void)的修饰名是?StubCode@@YA_JXZ,修改汇编代码如下:
.code PUBLIC ?StubCode@@YA_JXZ ?StubCode@@YA_JXZ PROC mov rax, 4711 ret ?StubCode@@YA_JXZ ENDP end
但这种方式维护性极差,函数签名(返回值、参数)变化时修饰名也会同步改变,优先推荐方案1。
额外检查项
- 确认汇编文件的项类型已设置为「Microsoft Macro Assembler」:右键汇编文件→属性→配置属性→常规→项类型,选择对应选项。
- 确认项目编译平台为x64:解决方案平台选择x64,避免汇编与C++代码的编译架构不匹配。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

