Я пишу библиотеку программирования на основе событий для использования на BeagleBone Black и обнаружил странную ошибку.
Когда я компилирую точно такой же код с точно такими же флагами, я получаю следующие ошибки на процессоре на базе ARM, но не когда запускаю код, скомпилированный для моего компьютера x86.
$ ./missionControl
pure virtual method called
pure virtual method called
pure virtual method called
terminate called recursively
terminate called recursively
Aborted
Когда я компилирую и запускаю на своем ноутбуке, программа работает корректно.
Это команда, которую я использую для компиляции (да, я использую Makefile, но оба метода компиляции демонстрируют одинаковое поведение):
g++ -std=gnu++11 -pthread -O3 -D_GLIBCXX_USE_NANOSLEEP -o missionControl `find . -name *.cpp`
Неважно, выполняю ли я кросс-компиляцию с Ubuntu arm-linux-gnueabi-g++
или с ARM-совместимой g++
на реальном BeagleBone, я все равно получаю ошибки на ARM.
Мой вопрос заключается в следующем: что может быть причиной этой ошибки и что я могу сделать, чтобы попытаться найти источник? Почему это происходит на одной процессорной архитектуре, а не на другой, для одной и той же версии G++?
Спасибо!
Вот обратная трассировка из GDB процессора ARM:
#0 0xb6d4adf8 in raise () from /lib/libc.so.6
#1 0xb6d4e870 in abort () from /lib/libc.so.6
#2 0xb6f50ab4 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6
#3 0xb6f4ea4c in ?? () from /usr/lib/libstdc++.so.6
#4 0xb6f4ea4c in ?? () from /usr/lib/libstdc++.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
main
? - person Kerrek SB   schedule 16.11.2013cout
прямо вверху main(). Единственная глобальная переменная, которая у меня есть, — это мьютекс в одной единице трансляции, поэтому я попытаюсь учесть это в классе. - person Alex Reinking   schedule 16.11.2013main()
, так что не должно быть необходимости играть с глобальными переменными, верно? - person Alex Reinking   schedule 16.11.2013