У меня вопрос относительно использования одного из вариантов компоновщика GCC: -Wl, - defsym.Ошибка поиска символа при использовании -Wl, - defsym GCC option
Некоторое время назад я решил переписать один из своих проектов на C++, но без использования его стандартной библиотеки и даже без привязки к нему (я компилирую исходные файлы .cpp в объектные файлы с помощью компилятора C++, но связываю их с помощью компилятора C) ,
Для этого я использовал следующие флаги компилятора:
-fno-exceptions -fno-rtti -nostdlib -nodefaultlibs
И следующие опции компоновщика:
-Wl,--defsym -Wl,__cxa_pure_virtual=0
Использование этих флагов я получил мой разделяемая библиотека компиляции и компоновки в порядке. Но после того, как я пытаюсь использовать свою общую библиотеку в какой-то простой программе (также компилируются и связан с использованием вышеуказанных флагов) я получаю следующее сообщение об ошибке при запуске его:
examples/bin/blink: symbol lookup error: examples/bin/libblink.so: undefined symbol: __cxa_pure_virtual
где мигнутие имя исполняемого файла и libblink.so это имя моей общей библиотеки.
Я попытался это исправить, и это выглядит как замена --Wl, - defsym компоновщик флаг (как для исполняемого файла и библиотеки) с помощью этой функции:
extern "C" void __cxa_pure_virtual
{
while (true);
}
делает работу. Почему -Wl, - defsym не работает в этом случае? Я также хотел бы упомянуть, что я тестировал это под Windows, и он отлично работает.
* Повторите один из моих проектов на C++, но не используя его стандартную библиотеку и даже не связавшись с ней * почему на земле? Стандартная библиотека - это то, что дает C++, это сила! – SergeyA
Существует множество причин, по которым не хотелось бы, чтобы его программа была связана с C++ std lib. Один из них будет ограниченным пространством для встроенных устройств. – user2180248
Я не понимаю: вы использовали вызовы виртуальных функций? Как это должно работать без поддержки времени выполнения? – user16