GCC非法指令

时间:2017-06-23 19:47:50

标签: c++ gcc

编译此代码时:

#include <random>
#include <iostream>

int main(int argc, char** argv)
{
    std::random_device dev;
    std::mt19937 mt(dev());
    std::cout << mt() << std::endl;
    return 0;
}

然后尝试使用gdb运行生成的可执行文件我收到此错误:

  

编程收到信号SIGILL,非法指令。 std::(anonymous namespace)::__x86_rdrand () at   /build/gcc/src/gcc/libstdc++-v3/src/c++11/random.cc:69 69   /build/gcc/src/gcc/libstdc++-v3/src/c++11/random.cc:没有这样的文件或目录。

我将 arch linux Intel Core 2 Duo CPU T8100 一起使用。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

错误消息是“非法指令”,您获得的唯一提示是__x86_rdrand()。谷歌搜索rdrand导致RDRAND instruction,这似乎是为Ivy Bridge处理器添加的,你的Core 2 Duo肯定不是。 (这张图上是Penryn:https://en.wikipedia.org/wiki/Template:Intel_processor_roadmap

好的,所以你的CPU没有RDRAND。这意味着编译器必须具有关于其目标是什么的错误信息。使用GCC,要调整的标志是-march。在您的情况下,-march=core2应该这样做。也可以说-march=native,它将准确定位你正在编译的内容。