汇编器消息:编译C++时没有这样的指令
Assembler Messages: no such instruction when Compiling C++
我正在尝试在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的答案是正确的,因为编译器调用的汇编程序不理解编译器生成的汇编代码。
至于为什么会这样,有多种可能性:
- 您手动安装了较新的编译器,而没有更新汇编程序
- 编译器生成 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
的输出和整个编译器命令行,从而导致上述错误消息。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- boost::进程间消息队列引发错误
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- C++:对不存在的命名空间使用命名空间指令
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 函数名是c中该函数的第一条指令的地址吗
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- QT打印二进制树指令消息
- 汇编器消息:错误:拇指条件指令应该在 IT 块中 - "strexeq r1,r2,[r4]"
- 汇编器消息:编译C++时没有这样的指令