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

Assembler Messages: no such instruction when Compiling C++

本文关键字:指令 消息 编译 C++ 汇编器      更新时间:2023-10-16

我正在尝试在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'

我已经同意遵循这个问题的建议,而我的输出没有变化:使用汇编程序消息编译错误

我的编译器选项目前是:

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

有谁知道可能导致这种情况的原因是什么?

这意味着 GCC 正在输出您的汇编程序不支持的指令。这要么来自源代码中的内联asm,要么不应该发生,并建议您使用较新的汇编程序在另一台计算机上编译 GCC,然后将其复制到另一台无法正常工作的机器上。

假设这些指令没有在asm语句中显式使用,你应该能够告诉GCC不要发出带有合适标志(如-mno-avx)的指令(或任何适合禁用这些特定指令的标志)。

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

至于为什么会这样,有多种可能性:

  1. 您手动安装了较新的编译器,而没有更新汇编程序
  2. 编译器生成 64 位指令,但由于某种原因,汇编程序仅限于 32 位指令

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

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

如果您的 Linux 安装仅为 32 位(怀疑 2.),那么您根本不应该生成 64 位二进制文件。这是可能的,但不是微不足道的...

请发布uname -a的输出和整个编译器命令行,从而导致上述错误消息。