Я полагаю, что обе эти ошибки означают, что у класса есть виртуальные функции, но нет не встроенных виртуальных функций (это легко сделать, если вы пришли, скажем, из Java).GCC испускает vtable и (я полагаю) typeinfo, когда он испускает первую не встроенную виртуальную функцию в классе.Если все ваши виртуальные функции встроены, эти биты не будут сгенерированы.
Вам необходимо переместить встроенную виртуальную функцию в исходный файл и сделать ее не встроенной.Деструктор часто является хорошим кандидатом.
РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял ваш вопрос.Как насчет временно сделать ваши виртуальные функции не виртуальными, чтобы компоновщик испускал отсутствующий символ для этой точной функции, а не для vtable?Вы, очевидно, должны были бы помнить, чтобы ревиртуализировать их позже.
EDIT2: Когда я пытался скомпилировать это, я получил описательную ошибку.Можете ли вы вставить минимальный пример, который не подходит?
class Foo
{
public:
virtual ~Foo();
};
int main()
{
Foo foo;
return 0;
}
Вывод:
Undefined first referenced
symbol in file
Foo::~Foo() /var/tmp//cc4C2j6B.o
vtable for Foo /var/tmp//cc4C2j6B.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status