【问题标题】:Compiling with -march causes threads to say "pure virtual method called"使用 -march 编译会导致线程说“调用​​了纯虚拟方法”
【发布时间】:2017-05-22 03:32:00
【问题描述】:

我正在尝试通过带有-march=armv8-a 标志的 gcc 编译我的 C++ Raspberry Pi 3 代码。但是,使用此标志会导致我的线程通过说pure virtual method called 失败。我知道它是 -march=armv8-a 标志,因为当我在没有它的情况下编译它时,线程又开始工作了。

请注意:线程甚至没有启动,它只是给出一个pure virtual method called

有人可以在他们的 Raspberry Pi 3 上用 -march=armv8-a 编译这个并报告他们得到了什么吗?

#include <iostream>
#include <thread>
#include <unistd.h>

void threadedFunction()
{
    std::cout << "Hello from thread" << std::endl;
}

int main()
{
    std::thread t1(threadedFunction);
    sleep(2);
    return 0;
}

【问题讨论】:

  • 你为什么同时detach()ing 和join()ing 一个线程?
  • @KevinDuarte 还是错了。你应该得到一个例外,因为一旦你detached,你就不能再join了。
  • @KevinDuarte Cppreference for std::detach: "调用 detach *this 后不再拥有任何线程。"如果删除 detach() 后问题消失了,我的猜测是未定义的行为。
  • 与 gcc 相比,您的代码更有可能存在错误,gcc 是一种在世界各地用于编译数千个多线程程序的编译器,并且具有广泛的内部测试套件。仅仅因为特定的编译器选项导致您的代码崩溃并不一定意味着它是编译器选项的问题。例如,编写一些与-O2 崩溃的代码应该不会太难。问题不是这个编译器选项,而是错误的代码。寻找代码中的错误,而不是编译器的问题。
  • 我发现 gcc 极不可能有这样的普通代码所展示的这种通用错误。更有可能的是,您正在使用的 gcc 存在某种配置或安装问题。可能某些运行时库未安装,或者链接了错误的库。不幸的是,stackoverflow.com 上只有一位用户知道您的 gcc 安装的详细信息以及它的配置方式。那个用户当然是你。

标签: c++ linux multithreading gcc raspberry-pi


【解决方案1】:

由于armv8-a 使用64 位架构,使用-march=armv8-a 标志将为64 位机器编译。但是,许多 Raspberry Pi 操作系统(图像)是 32 位的,这可能会导致崩溃或错误。

信用:https://stackoverflow.com/users/1505939/m-m

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多