我正在尝试在 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)
有谁知道这可能是什么原因造成的?
这意味着 GCC 正在输出您的汇编器不支持的指令。这要么来自asm源代码中的内联,要么不应该发生,并建议您在另一台机器上使用较新的汇编器编译 GCC,然后将其复制到另一台无法正常工作的机器。
假设这些指令没有在asm语句中显式使用,您应该能够告诉 GCC 不要使用合适的标志(-mno-avx或任何适合禁用这些特定指令的标志)发出这些指令。
@jonathan-wakely 的答案是正确的,因为编译器调用的汇编器不理解编译器生成的汇编代码。
至于为什么会出现这种情况,有多种可能:
禁用 AVX ( ) 不太可能有帮助,因为它也没有明确请求——引用的 CXXFLAGS 中-mno-avx没有。-march如果它确实有帮助,那么您就没有向我们展示所有编译器标志——如果您只是包含整个编译器命令行,那就最好了。
如果我的怀疑在上面 1. 中是正确的,那么您应该构建和/或安装最新的 binutils 软件包,该软件包将提供asAVX 指令等信息。然后,您需要使用--with-as=/path/to/the/updated/as传递给 的标志来重建编译器configure。
如果您的 Linux 安装仅为 32 位(怀疑 2),那么您根本不应该生成 64 位二进制文件。这是可能的,但并非微不足道......
uname -a请发布导致上述错误消息的整个编译器命令行的输出。