g ++ неопределенная ссылка на typeinfo

Я просто натыкался на следующую ошибку (и нашел решение онлайн, но это не присутствует в Переполнении стека):

(.gnu.linkonce. [материал]): неопределенная ссылка на [метод] [объектный файл]: (.gnu.linkonce. [материал]): неопределенная ссылка на 'typeinfo для [имени класса]'

Почему можно было бы получить один из них "неопределенная ссылка на typeinfo" ошибки компоновщика?

(Бонусные очки, если можно объяснить, что продолжается негласно.)

195
задан cdleary 20 November 2008 в 14:02
поделиться

1 ответ

Если вы компонуете один .so с другим, еще одна возможность - компиляция с "-fvisibility=hidden" в gcc или g++. Если оба .so файла были собраны с "-fvisibility=hidden" и ключевой метод не находится в том же .so, что и другая реализация виртуальной функции, то последняя не увидит vtable или typeinfo первой. Для компоновщика это выглядит как нереализованная виртуальная функция (как в ответах paxdiablo и cdleary).

В этом случае вы должны сделать исключение для видимости базового класса с помощью

__attribute__ ((visibility("default")))

в объявлении класса. Например,

class __attribute__ ((visibility("default"))) boom{
    virtual void stick();
}

Другое решение, конечно, не использовать "-fvisibility=hidden". Но это усложняет работу компилятора и компоновщика, возможно, в ущерб производительности кода.

19
ответ дан 23 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: