Вот что я сделал:
Я изменил .h файл из
SomeObj* getCacheObj( int i = 0 );
в
SomeObj* getCacheObj( int i );
SomeObj* getCacheObj();
Я перекомпилировал код (без проблем), изменения пошли на somelib.so (один из много так файлы). Затем я заменил старый так на оборудовании этим и получил следующую ошибку при загрузке так:
undefined symbol: _ZN13KeypathHelper11getCacheObjEv
Теперь странным является то, что мне сказали, что этот класс используется только в этом файле (как я могу убедиться?). Я не настолько опытен и не уверен, как расследовать. Любые предложения приветствуются.
Обновить
Эта конкретная проблема была вызвана тем, что другой файл использовал класс KeypathHelper, и я заменил только тот, который его содержал. Способ, которым я узнал, что еще нужно обновить, заключался в том, чтобы найти все, что касается KeypathHelper.
_ZN13KeypathHelper11getCacheObjEv
символ является искаженным именем для KeypathHelper::getCacheObj()
(вы можете легко перевести с помощью c++filt
, например). Учитывая, что вы только добавили метод и что бы загружающий общий объект не мог найти, это заставляет меня думать, что вы не обновили общий объект или забыли предоставить определение для KeypathHelper::getCacheObj()
(другими словами — реализовать метод).
Чтобы исследовать, вы должны увидеть, что не удалось разрешить символ. Обычно разработчики имеют смысл для этого. Скажем, если бинарный XXX
не могу загрузить библиотеку YYY
из-за неразрешенного символа, то XXX
использует его, и он, кажется, не находится в YYY
(или где-нибудь еще в этом отношении). Если в этом нет смысла, можно прибегнуть к чтению ld.so (8) страница справочника и отладить динамический компоновщик с помощью доступных средств, таких как определение LD_DEBUG
,
Кроме того, @PlasmaHH задала очень хороший вопрос. Если единственное изменение, которое вы внесли, было в файл заголовка, то вы должны знать, что отдельная функция / метод со значением по умолчанию для параметра отличается от двух функций / методов, где у одного есть параметр, а у другого — нет.
Что касается вашего второго вопроса о том, как убедиться, что символ в общем объекте не используется снаружи — вы должны изменить видимость символа, чтобы никто снаружи не мог связать / разрешить / использовать символ. Например, см. GCC Visibility.
Надеюсь, поможет. Удачи!
Других решений пока нет …