3

这是我所做的:

我更改了一个 .h 文件

SomeObj* getCacheObj( int i = 0 );

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

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

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

更新

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

4

1 回答 1

4

_ZN13KeypathHelper11getCacheObjEv符号是一个错误的名称KeypathHelper::getCacheObj()(例如,您可以使用 轻松翻译c++filt)。鉴于您只添加了一个方法并且加载共享对象的任何内容都找不到它让我认为您没有更新共享对象或忘记提供定义KeypathHelper::getCacheObj()(换句话说 - 实现该方法)。

为了进行调查,您必须查看无法解析符号的原因。通常,开发人员对此有所了解。说,如果二进制文件由于未解析的符号而XXX无法加载库,那么正在使用它并且它似乎不在(或其他任何地方)。如果没有任何意义,可以求助于阅读ld.so (8) 手册页并使用可用的方法(如定义)来调试动态链接器。YYYXXXYYYLD_DEBUG

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

至于您关于如何确保共享对象中的符号不​​在外部使用的第二个问题 - 您必须更改符号可见性,以便外部的任何人都无法链接/解析/使用该符号。例如,请参阅GCC 可见性

希望能帮助到你。祝你好运!

于 2013-02-26T14:30:54.587 回答