4

我正在为 Windows 编译 VS2012 和 GCC (CodeBlocks) 下的项目。在 VS2012 上一切正常。在 GCC 下,我得到以下编译错误:

C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|164|Error: invalid use of register|
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|166|Error: invalid use of register|
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|221|Error: invalid use of register|
||=== Build finished: 3 errors, 14 warnings (0 minutes, 0 seconds) ===|

我正在使用编译器选项 -fpermissive - 它应该与错误无关。

我只是不明白为什么它指向Local Temp文件夹下的临时文件,并说我使用了错误的寄存器?

有人知道发生了什么吗?

4

2 回答 2

4

看起来您在编译器中遇到了错误。错误消息(从“源”文件名判断)来自汇编程序。汇编器应该生成错误消息的唯一时间是当汇编器中有一些非法的东西时,C++ 编译器永远不应该生成非法的汇编器;如果它不能生成合法的汇编程序,它应该输出一个错误信息并且失败。

当您收到此类消息时,真正的问题是要弄清楚您的代码中是什么触发了它。g++ 有一个选项告诉它不要删除任何中间文件。使用它,然后尝试查看这些行的汇编文件中发生了什么。(当你要求 g++ 输出汇编程序时,它会在其中添加漂亮的注释以帮助找到相应的源。我不知道在生成汇编程序作为中间文件时它是否也这样做。)然后尝试剪切代码(如果更糟的话更糟糕的是,使用二进制搜索),直到你可以得到一两行程序的错误。尝试猜测它们有什么特别之处,并改变它们以不同的方式做同样的事情。

并且不要不向 g++ 报告错误。

于 2013-02-25T12:35:51.137 回答
1

感谢 James Kanze 的建议,我决定告诉编译器不要删除临时文件。这是由标志完成的:

-保存临时

正如 James 所说,汇编器生成了一些很好的注释,它们准确地告知我们的 C++ 代码中的哪一行引发了错误。就我而言,它似乎不接受这样的指令:

asm
(
    ".intel_syntax noprefix\n"
    "lock dec [DWORD PTR eax]\n"
    ".att_syntax \n"
    :
    : "a" (data)
    :
);

我不知道他为什么不再接受 Intel Syntax,因为它与以前的 GCC 版本一起工作,现在我更新了它,它不再。

无论如何,此类问题的解决方案是詹姆斯提到的解决方案:只是不要删除中间文件,以便您可以直接窥探汇编代码出了什么问题。

关于 INTEL 语法的问题,知道为什么它不再起作用了吗?

于 2013-02-26T13:18:34.517 回答