sawzall中,"unknown type kind in type description string"的原因

最近遇到了一个奇怪的问题,在创建emitter的时候遇到“unknown type kind in type description string: sum”错误。

这个问题是这样:

emitters/szlbootstrapsumresults.cc这个文件编译后的代码在libszlemitters.so中,szlbootstrapsumresults.cc这个文件的末尾有一个宏

REGISTER_SZL_RESULTS(bootstrapsum, SzlBootstrapsumResults);

它展开后是一个类型为SzlResultsRegisterer的静态变量。这个类的构造函数的实现在szlresult.cc中。

szlresult.cc中定义了这样一个静态变量:

static SzlResultsCreators* creators;

它在SzlResultsRegisterer的构造函数中会按需初始化,即,第一次调用SzlResultsRegisterer的时候,初始化creators这个静态变量。

在creators未被初始化(即creators==NULL)的情况下,SzlResults::Properties函数无法工作,所以会直接返回false。这就导致SzlType::InitFromSzlProto无法工作,也就是说,无法从二进制数据反序列化得到SzlType对象。

这个问题在于,链接器发现我要用到SzlResults这个类,所以把emitvalues/szlresults.cc所在的so(libszl.so)包含了进来。但是它没有发现emitvalues/szlresults.cc中的静态变量creators需要被libszlemitters.so中的代码初始化。当然,这不能怪gnu ld,这得怪库的作者没有考虑到这种情况?

解决办法:

这个问题不需要特别解决。因为我平时写代码喜欢边写边测试。所以只需要继续往下写,把剩下的代码写完即可。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥