Frage

Ich schreibe eine ereignisbasierte Programmierbibliothek zur Verwendung auf dem BeagleBone Black und hat einen seltsamen Fehler aufgetreten.

Wenn ich den gleichen Code mit den gleichen Flaggen kompiliere, erhalte ich die folgenden Fehler auf dem armbasierten Prozessor, aber nicht, wenn ich den Code ausführen, der für meinen X86-Computer kompiliert wurde.

generasacodicetagpre.

Wenn ich auf meinem Laptop kompiliere und ausgeführt habe, läuft das -Programm korrekt .

Dies ist der Befehl, den ich verwende, um zu kompilieren (ish, ich verwende ein Makefile, aber beide Kompilierungsmethoden zeigen genau das gleiche Verhalten):

generasacodicetagpre.

Es spielt keine Rolle, ob ich mit Ubuntus generakodicetagcode oder dem arm-kompatiblen arm-linux-gnueabi-g++ auf dem eigentlichen Beaglebone kreuze, ich bekomme immer noch Fehler auf den Arm.

Meine Frage ist das: Was könnte diesen Fehler verursachen, und was kann ich tun, um die Quelle zu finden? Warum sollte dies auf einer Prozessorarchitektur, aber nicht anders, für dieselbe Version von G ++?

danke!

Hier ist ein Backtrace von der GDB des Armprozessors:

generasacodicetagpre.

War es hilfreich?

Lösung

Das Problem wurde herausgefunden, dass er sich auf einen Fehler in der ARM-Version von LibstDC ++ anbietet, der auf dem BeagleBone läuft.Ein kleines Spielzeugprogramm, das überhaupt keine virtuellen Funktionen aufweist, verursacht überhaupt denselben Fehler ("reine virtuelle Funktion namens"), wenn STD :: Thread erstellt wird.

Ich werde versuchen, eine benutzerdefinierte Version von GCC / Libstdc ++ 4.8 auf dem Beaglebone selbst zu kompilieren - auch wenn es lange dauert.

Andere Tipps

The pure virtual method called error occurs when you attempt to use dynamic dispatch to call a function that is pure virtual in a base before the derived type that implements it has been constructed or after it has already destructed.

The most common cause for this is if the base class attempts to call a virtual function that is pure at this level through the constructor or destructor. Other than that, as it has been pointed out in some comments, if you attempt to access a dead object, you might also run into this same issue.

Just attach a debugger to the program and see what virtual function is called and from where.

See: https://groups.google.com/forum/#!topic/automatak-dnp3/Jisp_zGhd5I

And: Why does this simple c++11 threading-example fail, when compiled with clang 3.2?

Now, I have no idea why this works, but it does for me at least. Add the following four preprocessor definitions to the compiler command line:

__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8

I haven't experimented to see if they are all required, or whether or not you can get away with only some. But this solved the problem for me. Thanks to those who wrote the above answers, and thanks to my colleague for out-googling me :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top