汇编程序消息:编译C ++时没有这样的指令

时间:2016-07-15 19:16:39

标签: c++ c++11 gcc

我正在尝试使用Scientific Linux版本6.7上的gcc / 5.3编译C ++代码。每当我运行Makefile时,我都会遇到以下错误:

/tmp/ccjZqIED.s: Assembler messages:
/tmp/ccjZqIED.s:768: Error: no such instruction: `shlx %rax,%rdx,%rdx'
/tmp/ccjZqIED.s:1067: Error: no such instruction: `shlx %rax,%rdx,%rdx'
/tmp/ccjZqIED.s: Assembler messages:
/tmp/ccjZqIED.s:6229: Error: no such instruction: `mulx %r10,%rcx,%rbx'
/tmp/ccjZqIED.s:6248: Error: no such instruction: `mulx %r13,%rcx,%rbx'
/tmp/ccjZqIED.s:7109: Error: no such instruction: `mulx %r10,%rcx,%rbx'
/tmp/ccjZqIED.s:7128: Error: no such instruction: `mulx %r13,%rcx,%rbx'

我很乐意遵循这个问题的建议而不改变我的输出: Compile errors with Assembler messages

我的编译器选项目前是:

CXXFLAGS        = -g -Wall -O0 -pg -std=c++11

有没有人知道造成这种情况的原因是什么?

2 个答案:

答案 0 :(得分:2)

这意味着GCC正在输出汇编程序不支持的指令。这些来自源代码中的内联asm,或者不应该发生,并建议您在具有较新汇编程序的其他计算机上编译GCC,然后将其复制到另一台计算机它没有正常工作。

假设这些指令未在asm语句中明确使用,您应该能够告诉GCC不要使用合适的标志(如-mno-avx(或任何适当的标志)发出这些指令禁用这些特定指令。)

答案 1 :(得分:0)

@ jonathan-wakely的答案是正确的,因为编译器调用的汇编器不理解编译器生成的汇编代码。

关于为什么发生的可能性有多种:

  1. 您是在不更新汇编程序的情况下手动安装了较新的编译器
  2. 您的编译器生成64位指令,但出于某种原因,汇编程序仅限于32位指令

禁用AVX(-mno-avx)不太可能会有所帮助,因为也没有明确请求-引用的CXXFLAGS中没有-march。如果确实有帮助,那么您不会向我们展示所有编译器标志-如果只包含整个编译器命令行,那将是最好的选择。

如果我的怀疑在上面的1.中是正确的,那么您应该构建和/或安装最新的binutils软件包,该软件包将as提供有关AVX指令的信息。然后,您需要使用传递给--with-as=/path/to/the/updated/as的{​​{1}}标志来重建编译器。

如果您的Linux安装仅是32位(怀疑2),那么您根本不应该生成64位二进制文​​件。可能,但并非无关紧要...

请发布configure的输出和整个编译器命令行,导致出现上述错误消息。