c++ 如何理解Emscripten中的UnboundTypeError

j9per5c4  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(318)

我有一个很大的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 );
}

我大致了解了为什么会发生这个错误,但是我不知道如何解释这些标识符,比如N27ILNS0_15EEES4_EE等等。我假设它们以C++的方式表示数据类型,但是由于我是JavaScript背景,所以我不知道如何读取这些标识符。
是否有任何参考或文档(或者可能是常识)解释如何理解这一点?

pod7payv

pod7payv1#

看来自己当初的猜测完全错了。
这是由name mangling技术引起的。
可以使用以下方法解码损坏的名称(类似于URI解码)以获得人类可读的信息:

# Ignore that this code may not make sense, it's just to showcase the tool
echo "NSt3__28optionalIN2XY9Something10DateObjectEEE, NSt3__28optionalIN2XY5DateTINS1_2XY10DateObjectEEEEE" | c++filt -t
std::__2::optional<XY::Something::DateObject>, std::__2::optional<XY::DateT<XY::XY::DateObject> >

相关问题