Исходя из нашего обсуждения вашего вопроса, я уверен, что это как-то связано с тем фактом, что все ваши методы определены в определении класса. Это означает, что у gcc нет функции «key», наряду с которой он может выдавать символ для объекта typeinfo, т.е. нет единого объектного файла, в который можно поместить объект typeinfo. Поэтому gcc делает так, чтобы выдавать символ typeinfo в каждый объект файл, который требует этого и сообщает компоновщику, чтобы он игнорировал дубликаты при создании dylib.
Причина, по которой я спросил об атрибутах видимости, заключается в том, что если хотя бы один из дублированных символов помечен как «скрытый», то компоновщик будет скрывать символ typeinfo внутри dylib, и любая другая часть вашего приложения не сможет его найти. во время выполнения. Вы не получите ошибку времени компиляции, которая, кажется, соответствует поведению, о котором вы сообщаете.
Если вы не уверены, используете ли вы атрибуты видимости, то, скорее всего, нет, поскольку видимость по умолчанию - «по умолчанию», что в основном означает не скрытый. Найдите параметры для gcc, которые начинаются с -fvisibility
в ваших файлах сборки. Видимость также может быть отмечена в коде с помощью таких вещей, как __attribute__ ((visibility ("hidden")))
.
Причина, по которой я предложил переместить хотя бы одно определение элемента в файл cpp, заключалась в том, чтобы принудительно вызвать один выброс объекта typeinfo и проверить, имеет ли это значение. Вы не сказали, пробовали ли вы это или нет, поэтому было бы полезно узнать.