C++ 称为交叉编译的纯虚拟方法

C++ 称为交叉编译的纯虚拟方法,c++,cross-compiling,embedded-linux,virtual-functions,g++-4.7,C++,Cross Compiling,Embedded Linux,Virtual Functions,G++ 4.7,我正在编写一个用于BeagleBone Black的基于事件的编程库,遇到了一个奇怪的错误 当我使用完全相同的标志编译完全相同的代码时,我会在基于ARM的处理器上收到以下错误,但在我运行为x86计算机编译的代码时不会收到这些错误 $ ./missionControl pure virtual method called pure virtual method called pure virtual method called terminate called recursively termin

我正在编写一个用于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,但两种编译方法表现出完全相同的行为):

无论我是在实际的BeagleBone上使用Ubuntu的
arm-linux-gnueabi-g++
还是与arm兼容的
g++
进行交叉编译,arm上仍然会出现错误

我的问题是:是什么导致了这个错误,我该怎么做才能找到错误的根源?对于同一版本的G++,为什么会在一个处理器体系结构上发生这种情况,而不是在另一个处理器体系结构上

谢谢

以下是ARM处理器GDB的回溯:

#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?)
当您试图在实现它的派生类型被构造之前或在它被破坏之后,使用动态分派来调用基中的纯虚拟函数时,就会出现名为error的纯虚拟方法

最常见的原因是基类试图通过构造函数或析构函数调用此级别的纯虚函数。除此之外,正如一些评论中指出的,如果您试图访问一个死对象,您也可能会遇到同样的问题


只需将调试器连接到程序,然后查看调用了什么虚拟函数以及从何处调用。

问题原来是由于BeagleBone上运行的ARM版本libstdc++中的一个bug造成的。当创建std::thread时,一个完全没有虚拟函数的小玩具程序会导致相同的错误(“调用纯虚拟函数”)

我将尝试在BeagleBone本身上编译gcc/libstdc++4.8的自定义版本,即使这需要很长时间。

请参阅:

以及:

现在,我不知道为什么这样做,但至少对我来说是这样。将以下四个预处理器定义添加到编译器命令行:

__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

我还没有做过实验,看看它们是否都是必需的,或者你是否只需要一些就行了。但这为我解决了问题。感谢那些写了以上答案的人,也感谢我的同事在谷歌上搜索我:)

在管理某个多态对象或对象集合的生命周期时,您可能出现了错误。当您试图删除已删除的内容时,通常会显示此错误。此错误发生在我启动程序时,在删除任何内容之前(我想)。。。我在整个程序中使用智能指针,valgrind报告在x86.Hm上正确运行的程序结束时没有错误和所有内存释放。。。试着减少这个问题?删除全局变量直到它工作?您确定错误发生在调用
main
之前吗?@KerrekSB我不确定是否发生在调用main()之前。让我尝试在main()的顶部添加一个
cout
。我唯一拥有的全局变量是一个翻译单元中的互斥量,所以我将尝试将其分解到一个类中。我有一个完全相同的问题-我猜没有多少人在beagleboard上使用std::thread,嗯?你能提供一个关于如何使用GDB查找此错误的提示吗?如果我让它运行并崩溃,回溯就没有多大帮助。我在我的问题上加了一个回溯。还有,为什么这只会发生在手臂上?同一个编译器版本在x86上发出了很好的代码。我只是用常规虚拟函数替换了所有纯虚拟函数,这些函数打印函数名,然后调用
abort()
。我仍然遇到同样的问题,并且我插入的错误信息从未被打印出来。我最终从BeagleBone上删除了可怕的Angstrom linux,并用Ubuntu取代了它。交叉编译工作如预期。对于任何使用这个奇妙设备的人:擦掉它,改为安装Ubuntu。你最终尝试构建gcc了吗?还是你放弃了,直接去Ubuntu?我试着构建gcc。构建中途失败。我擦了擦,去了Ubuntu。
__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