如何在.ASM文件中调用命名空间函数?是否可行及语法是什么?
问题解答
1. 能否从汇编文件调用命名空间内的C++函数?
可以调用,但要注意C++的**名字修饰(Name Mangling)**机制:命名空间内的函数会被编译器修改名称,汇编代码里必须使用修饰后的名字才能正确链接。
2. 正确的调用语法
方法1:使用编译器生成的修饰名
不同编译器的名字修饰规则不同,以MSVC为例,MyNameSpace::PrintString()的修饰名通常是?PrintString@MyNameSpace@@YAXXZ(可通过查看编译生成的.obj文件符号表获取准确修饰名)。
修改汇编代码如下:
EXTERN ?PrintString@MyNameSpace@@YAXXZ:PROC .data dbgString byte "Just a string!", 0 .code main PROC CALL ?PrintString@MyNameSpace@@YAXXZ main ENDP
方法2:用extern "C"消除名字修饰
如果不想依赖编译器特定的修饰名,可在C++头文件中用extern "C"声明函数,让编译器按照C语言规则生成未修饰的名字:
修改Test.h:
namespace MyNameSpace { extern "C" void PrintString() { // 函数实现 } }
此时汇编代码可直接使用原函数名:
EXTERN PrintString:PROC .data dbgString byte "Just a string!", 0 .code main PROC CALL PrintString main ENDP
错误原因说明
你遇到的LNK2019错误,是因为汇编里声明的PrintString找不到对应符号——C++编译器将MyNameSpace::PrintString编译成了带命名空间修饰的名字,而汇编里使用的是未修饰的原名字,链接器无法匹配两者。
内容的提问来源于stack exchange,提问作者JkT
相关产品推荐
相关产品推荐

