C ++名称在这样一个名字

时间:2013-02-26 14:21:52

标签: c++ dynamic-linking shared-libraries name-mangling

这就是我所做的:

我从

更改了.h文件
SomeObj* getCacheObj( int i = 0 );

SomeObj* getCacheObj( int i );
SomeObj* getCacheObj();

我重新编译了代码(没有问题),更改发送到somelib.so(很多之一的文件)。然后我用这个替换旧的设备,并在加载时得到了下面的错误: undefined symbol: _ZN13KeypathHelper11getCacheObjEv

现在奇怪的是,我被告知这个类只用在这个文件中(我怎么能确定?)。我不是那么有经验,也不确定如何调查。欢迎任何建议。

更新

这个特殊问题的原因是因为另一个文件正在使用KeypathHelper类而我只替换了包含它的那个。我发现哪些其他需要更新的方式是为了KeypathHelper所有这些。

1 个答案:

答案 0 :(得分:4)

_ZN13KeypathHelper11getCacheObjEv符号是KeypathHelper::getCacheObj()的错位名称(例如,您可以使用c++filt轻松翻译)。鉴于您只添加了一个方法,无论加载什么,共享对象都找不到,这让我觉得您没有更新共享对象或者忘记提供KeypathHelper::getCacheObj()的定义(换句话说 - 实现法)。

为了进行调查,您必须查看无法解析符号的内容。通常,开发人员对此有所了解。比如说,如果二进制文件XXX由于未解析的符号而无法加载库YYY,那么XXX正在使用它,它似乎不在YYY中(或其他任何位置)那件事)。如果没有意义,可以使用读取ld.so (8) manual page并使用定义LD_DEBUG等可用方法调试动态链接器。

另外,@ PlasmaHH提出了一个非常好的问题。如果你所做的唯一更改是头文件,那么你必须知道一个参数的默认值的单个函数/方法与两个函数/方法不同,其中一个函数/方法有一个参数而一个没有参数。 / p>

关于如何确保共享对象中的符号未在外部使用的第二个问题 - 您必须更改符号可见性,以便外部没有人能够链接/解析/使用该符号。例如,请参阅GCC Visibility

希望它有所帮助。祝你好运!