我有一个很大的C++代码库,它使用Emscripten生成WebAssembly模块。当我向从WebAssembly返回的对象添加新属性时,我经常得到UnboundErrorType
,格式如下:
Cannot call MyModule.myFunc due to unbound types:
N2XY7Something26DateObjectTILNS0_15OptionalMembersE1ENS_5DateTINS0_12DateObjectEEES4_EE
Cannot call MyModule.myFunc due to unbound types:
NSt3__28optionalIN2XY7Something12DateObjectEEE, NSt3__28optionalIN2XY5DateTINS1_7XY12DateObjectEEEEE
虽然我并不是在寻找一个特定的解决方案,而是在寻找一个解释,但这通常是由如下代码引起的:
auto getDay ( XY::Something::DateObject const & d ) { return d.getDay (); }
auto getMonth( XY::Something::DateObject const & d ) { return d.getMonth(); }
auto getYear ( XY::Something::DateObject const & d ) { return d.getYear (); }
void dummyDateObjectSet( XY::DateObject &, bool ) {}
EMSCRIPTEN_BINDINGS( MyObject )
{
value_object< XY::DateObject >( "DateObject" )
.field( "day" , getDay , dummyDateObjectSet )
.field( "month", getMonth, dummyDateObjectSet )
.field( "year" , getYear , dummyDateObjectSet );
}
我大致了解了为什么会发生这个错误,但是我不知道如何解释这些标识符,比如N2
、7
、ILNS0_15
、EEES4_EE
等等。我假设它们以C++的方式表示数据类型,但是由于我是JavaScript背景,所以我不知道如何读取这些标识符。
是否有任何参考或文档(或者可能是常识)解释如何理解这一点?
1条答案
按热度按时间pod7payv1#
看来自己当初的猜测完全错了。
这是由name mangling技术引起的。
可以使用以下方法解码损坏的名称(类似于URI解码)以获得人类可读的信息: