称为纯虚方法 - 交叉编译

时间:2013-11-15 21:00:57

标签: 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
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++或实际的BeagleBone上的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?)

3 个答案:

答案 0 :(得分:4)

问题原因是由于在BeagleBone上运行的ARM版libstdc ++中存在错误。当创建std :: thread时,一个没有虚函数的小玩具程序会导致同样的错误(“纯虚函数调用”)。

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

答案 1 :(得分:2)

当您尝试使用动态分派在构建实现​​它的派生类型之前调用基本上为纯虚函数的函数时,或者在已经构造它之后,会发生名为的纯虚方法错误遭到破坏。

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

只需将调试器附加到程序中,然后查看调用的虚拟函数以及从哪里调用。

答案 2 :(得分:2)

请参阅:https://groups.google.com/forum/#!topic/automatak-dnp3/Jisp_zGhd5I

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

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

__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

我还没有尝试过检查它们是否全部是必需的,或者你是否只能侥幸逃脱。但这解决了我的问题。感谢那些撰写上述答案的人,并感谢我的同事在谷歌上搜索我:)