Вопрос

При компиляции с помощью avr-gcc я столкнулся с такими ошибками компоновщика, как:

undefined reference to `__cxa_pure_virtual'

Я нашел этот документ в котором говорится:

А __cxa_pure_virtual function — это обработчик ошибок, который вызывается при вызове чистой виртуальной функции.

Если вы пишете приложение на C++, имеющее чисто виртуальные функции, вы должны предоставить свои собственные __cxa_pure_virtual функция обработки ошибок.Например:

extern "C" void __cxa_pure_virtual() { while (1); }

Предложенное определение этой функции исправляет ошибки, но я хотел бы знать:

  • какова цель этой функции,
  • почему мне нужно определить это самому и
  • почему допустимо закодировать его как бесконечный цикл?
Это было полезно?

Решение

Если где-то во время выполнения вашей программы создается объект с незаполненным указателем виртуальной функции, и при вызове соответствующей функции вы будете вызывать «чистую виртуальную функцию».

Описываемый вами обработчик должен быть определен в библиотеках по умолчанию, входящих в состав вашей среды разработки.Если вы пропустите библиотеки по умолчанию, вы обнаружите, что этот обработчик не определен:компоновщик видит объявление, но не определение.Вот тогда вам и нужно предоставить свою собственную версию.

Бесконечный цикл приемлем, поскольку это «громкая» ошибка:пользователи вашего программного обеспечения сразу это заметят.Любая другая «громкая» реализация также приемлема.

Другие советы

1) Какова цель функции __cxa_pure_virtual()?

Чистые виртуальные функции могут вызываться во время создания/разрушения объекта.Если это произойдет, вызывается __cxa_pure_virtual(), чтобы сообщить об ошибке.Видеть Откуда берутся сбои «вызова чисто виртуальной функции»?

2) Почему вам может потребоваться определить это самостоятельно?

Обычно эта функция предоставляется libstdc++ (например.в Linux), но avr-gcc и набор инструментов Arduino не предоставляют библиотеку libstdc++.

Arduino IDE удается избежать ошибки компоновщика при сборке некоторых программ, поскольку она компилируется с параметрами «-ffunction-sections -fdata-sections» и связывается с «-Wl,--gc-sections», что удаляет некоторые ссылки на неиспользуемые символы. .

3) Почему допустимо кодировать __cxa_pure_virtual() как бесконечный цикл?

Что ж, это, по крайней мере, безопасно;он делает что-то предсказуемое.Было бы полезнее прервать программу и сообщить об ошибке.Однако бесконечный цикл было бы неудобно отлаживать, если у вас нет отладчика, который может прерывать выполнение и возвращать трассировку стека.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top