Raspberry Pi C++11 std::thread:调用纯虚方法

Raspberry Pi C++11 std::thread:调用纯虚方法

Ubuntu 14.04。我已经安装了 gcc-arm-linux-gnueabihf、g++-arm-linux-gnueabihf(从 utopic 尝试了 4.8 和 4.9)。

使用 std::thread 的代码:

#include <iostream>
#include <chrono>
#include <future>

void secondList()
{
    const std::chrono::seconds twoSeconds(2);

    for (size_t i = 0; i != 300; ++i)
    {
        std::this_thread::sleep_for(twoSeconds);
        std::cout << "2s\n";
    }
}

int main(int, const char *[])
{
    auto secondThr = std::async(std::launch::async, secondList);

    return 0;
}

编译使用:

arm-linux-gnueabihf-g++ --std=c++11 main.cpp -lpthread -o main

在 RPI 上失败:

pi@raspberrypi ~ $ ./main 
pure virtual method called
terminate called without an active exception
Aborted

RPI 上的编译工作原理:

pi@raspberrypi ~ $ g++ --std=c++0x main.cpp -lpthread -o main

Pi 图像 2015-02-16-raspbian-wheezy,Pi 上的 g++(Debian 4.6.3-14+rpi1)4.6.3。

我已经尝试过编译器选项-mcpu=cortex-a7-mcpu=cortex-a8并且-D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_{1,2,4,8}在类似的问题中提到过。

还尝试了 ppa 中的 g++:http://ppa.launchpad.net/linaro-maintainers/toolchain/ubuntu精确的

为什么会发生这种情况以及如何获得可以工作的交叉编译器?

答案1

使用基于 jessie 的图像,它可以工作。

答案2

将其添加到用于链接的命令行,

-Wl,--whole-archive -lpthread -Wl,--no-whole-archive

请参阅此消息以获取解释,https://gcc.gnu.org/ml/gcc-help/2010-05/msg00029.html据说是 TLS 的问题,但也许与静态链接的不完整符号有关libpthread

答案3

-D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8可能可以通过添加命令行标志来修复此问题 。

根本原因和解决方法如下:https://raspberrypi.stackexchange.com/questions/48225/whats-causing-these-crashes-after-cross-compiling

相关内容