汇编器消息:编译 C++ 时没有此类指令

D.B*_*rry 2 c++ gcc c++11

我正在尝试在 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'
Run Code Online (Sandbox Code Playgroud)

我尝试遵循此问题的建议,而不更改我的输出: CompileErrors with Assembler messages

我的编译器选项目前是:

CXXFLAGS        = -g -Wall -O0 -pg -std=c++11
Run Code Online (Sandbox Code Playgroud)

有谁知道这可能是什么原因造成的?

Jon*_*ely 5

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

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


Mik*_* T. 5

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

至于为什么会出现这种情况,有多种可能:

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

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

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

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

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