динамическое связывание — искажение имени в C ++

Вот что я сделал:

Я изменил .h файл из

SomeObj* getCacheObj( int i = 0 );

в

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

Я перекомпилировал код (без проблем), изменения пошли на somelib.so (один из много так файлы). Затем я заменил старый так на оборудовании этим и получил следующую ошибку при загрузке так:
undefined symbol: _ZN13KeypathHelper11getCacheObjEv

Теперь странным является то, что мне сказали, что этот класс используется только в этом файле (как я могу убедиться?). Я не настолько опытен и не уверен, как расследовать. Любые предложения приветствуются.

Обновить

Эта конкретная проблема была вызвана тем, что другой файл использовал класс KeypathHelper, и я заменил только тот, который его содержал. Способ, которым я узнал, что еще нужно обновить, заключался в том, чтобы найти все, что касается KeypathHelper.

3

Решение

_ZN13KeypathHelper11getCacheObjEv символ является искаженным именем для KeypathHelper::getCacheObj() (вы можете легко перевести с помощью c++filt, например). Учитывая, что вы только добавили метод и что бы загружающий общий объект не мог найти, это заставляет меня думать, что вы не обновили общий объект или забыли предоставить определение для KeypathHelper::getCacheObj() (другими словами — реализовать метод).

Чтобы исследовать, вы должны увидеть, что не удалось разрешить символ. Обычно разработчики имеют смысл для этого. Скажем, если бинарный XXX не могу загрузить библиотеку YYY из-за неразрешенного символа, то XXX использует его, и он, кажется, не находится в YYY (или где-нибудь еще в этом отношении). Если в этом нет смысла, можно прибегнуть к чтению ld.so (8) страница справочника и отладить динамический компоновщик с помощью доступных средств, таких как определение LD_DEBUG,

Кроме того, @PlasmaHH задала очень хороший вопрос. Если единственное изменение, которое вы внесли, было в файл заголовка, то вы должны знать, что отдельная функция / метод со значением по умолчанию для параметра отличается от двух функций / методов, где у одного есть параметр, а у другого — нет.

Что касается вашего второго вопроса о том, как убедиться, что символ в общем объекте не используется снаружи — вы должны изменить видимость символа, чтобы никто снаружи не мог связать / разрешить / использовать символ. Например, см. GCC Visibility.

Надеюсь, поможет. Удачи!

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]