Столкнулся с проблемой некорректной работы dynamic_cast в G++ в лінуксе в шаблонных классах. Ситуация такая: написана библиотека, для этой библиотеки через SWIG написан .so модуль для Питона. Если вызывать методы моей либы из модуля, то динамик каст там не работает, если библиотеку прилинковать к своей программе, т.е. по-нормальному (не через dlopen и т.п.), то работает. Технические детали:
1) есть динамическая библиотека (shared object) OpenSceneGraph, в которой определён сложный шаблонный класс Vec3Array, один из отцов которого в иерархии является класс Array.
2) в этой библиотеке создаётся экземпляр данного класса и возвращается указатель типа Array
3) в моей динамической библиотеке (MyLib) получается указатель на данный экземпляр от библиотеки его создавшей (OpenSceneGraph) и через dynamic_cast приводится в указатель типа Vec3Array.
4) если я линкую свою библиотеку в свою программу, то dynamic_cast возращает правильный указатель, т.е. dynamic_cast<Vec3Array*>(getArray()) работает
5) ПРОБЛЕМА: есть третья библиотека (SwigWrappedModule) которая динамически линукуется с моей библиотекой (MyLib), но первая не линкуется с программой динамически по-умолчанию, а загружается через dlopen, и вызывает функции последней. Так вот, в этом случае (когда мои функции вызываются из третьей библиотеки) dynamic_cast возвращает ноль, хотя на самом деле указатель на тип правильный и там реально находится объект типа Vec3Array (проверяется средствами OpenSceneGraph после dynamic_cast на базовый НЕшаблонный класс Object)
Итак 1) MyProgram->MyLib->OSG -- works 2) someProgram... someLibrary->MyLib->OSG -- no dynamic cast
Данную проблему гуглом нашёл, оказывается проблема в шаблонах, копии которого раскиданы по разным библиотекам из-за чего получается, что их typeinfo несовместимы.
Кто с такими делами сталкивался, как решал?