如何从C++调用ASM函数?遇未解析外部符号错误求解决
解决C++调用汇编函数时的“未解析外部符号”问题
这个问题核心是C++名字修饰和汇编器/编译器的符号约定不匹配,以下分两种常用工具链给出解决方案:
方案1:GCC/G++ + NASM
- 修改C++代码,用
extern "C"禁用名字修饰:
extern "C" void foo(); int main() { foo(); return 0; }
- 保留你的NASM汇编代码:
section .text global foo foo: ret
- 编译链接步骤:
- 汇编生成目标文件:
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
- 同样在C++代码中添加
extern "C":
extern "C" void foo(); int main() { foo(); return 0; }
- 调整汇编代码适配MASM语法:
- 64位编译:
.code public foo foo proc ret foo endp end- 32位编译(MSVC会自动给C风格符号加下划线前缀):
.code public _foo _foo proc ret _foo endp end - 编译链接步骤:
- 汇编生成目标文件:64位用
ml64 /c foo.asm,32位用ml /c /coff foo.asm - 链接生成可执行文件:
cl main.cpp foo.obj
- 汇编生成目标文件:64位用
关键注意点
你之前的问题在于:切换MASM后未适配其语法(NASM的section .text对应MASM的.code,global对应public,函数需用proc/endp包裹),且未通过extern "C"阻止C对函数名进行修饰,导致汇编符号和C编译后的符号不匹配。
内容的提问来源于stack exchange,提问作者user24684540
相关产品推荐
相关产品推荐

