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

如何从C++调用ASM函数?遇未解析外部符号错误求解决

解决C++调用汇编函数时的“未解析外部符号”问题

这个问题核心是C++名字修饰和汇编器/编译器的符号约定不匹配,以下分两种常用工具链给出解决方案:

方案1:GCC/G++ + NASM

  1. 修改C++代码,用extern "C"禁用名字修饰:
extern "C" void foo();

int main() {
    foo();
    return 0;
}
  1. 保留你的NASM汇编代码:
section .text
global foo
foo:
    ret
  1. 编译链接步骤:
    • 汇编生成目标文件:nasm -f elf64 foo.asm -o foo.o(64位系统)或nasm -f elf32 foo.asm -o foo.o(32位系统)
    • 链接生成可执行文件:g++ main.cpp foo.o -o main

方案2:MSVC + MASM

  1. 同样在C++代码中添加extern "C":
extern "C" void foo();

int main() {
    foo();
    return 0;
}
  1. 调整汇编代码适配MASM语法:
    • 64位编译:
    .code
    public foo
    foo proc
        ret
    foo endp
    end
    
    • 32位编译(MSVC会自动给C风格符号加下划线前缀):
    .code
    public _foo
    _foo proc
        ret
    _foo endp
    end
    
  2. 编译链接步骤:
    • 汇编生成目标文件:64位用ml64 /c foo.asm,32位用ml /c /coff foo.asm
    • 链接生成可执行文件:cl main.cpp foo.obj

关键注意点

你之前的问题在于:切换MASM后未适配其语法(NASM的section .text对应MASM的.code,global对应public,函数需用proc/endp包裹),且未通过extern "C"阻止C对函数名进行修饰,导致汇编符号和C编译后的符号不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:03