2013-02-25 50 views
4

我正在编译VS2012和GCC(CodeBlocks)for Windows下的项目。 在VS2012上一切正常。在GCC我获得以下编译错误: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文件夹下的临时文件,并说我使用了错误的寄存器?

有没有人知道发生了什么?

+0

GCC实际上不是一个单一的程序,它是一组接一个地运行的程序。首先是预处理器,然后是实际的编译器,编译器生成汇编器代码,汇编器将生成汇编器代码,汇编器生成链接器用于创建最终可执行文件的目标文件。错误消息中提到的文件是生成的汇编程序文件。虽然这对你的问题没有多大帮助,但我希望能解释为什么你有这些临时文件。 – 2013-02-25 12:26:39

+0

@JoachimPileborg:看起来更像是一个编译器bug。警告表明*潜在*语义错误,但如果汇编程序生成错误,则可能表示编译器存在缺陷。 – 2013-02-25 12:36:40

+4

我的第二个最好的选择是汇编器和编译器的标志不匹配 - 这是一个生成代码的例子。对于SSE和一个需要传统的x86指令集。我最好的选择是,代码包含asm指令,VS2012采用英特尔语法,而gcc预计AT&T。 asm指令按原样传递给'as'阶段。 – 2013-02-25 12:42:53

回答

4

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

真正的问题是,当你得到这样的消息时, 找出你的代码触发它的内容。 g ++有一个 选项,告诉它不要删除任何中间文件 。使用它,然后尝试查看 这些行中的设置文件中发生了什么。 (当你要求g ++输出 汇编程序时,它会提供很好的注释以帮助找到相应的源程序 。我不知道这是否也是这样,当 生成汇编程序作为中间文件时。)然后尝试 切割代码如果情况变得更糟,则使用二进制搜索) ,直到您可以获得一行或两行程序的错误。 尝试猜测他们有什么特别的,并以不同的方式改变他们做同样的事情 。

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

+1

没错,除非有一些时髦的内联程序集正在使用(程序员可以编写他们想要的任何垃圾)。 – vonbrand 2013-02-25 13:58:19

+0

James Kanze,就是这样,我使用你的建议来解决它。我会尽快发布解决方案 – filipehd 2013-02-26 13:14:25

+0

詹姆斯Kanze,请看看我的答案,也许你知道第二个问题的答案。谢谢 – filipehd 2013-02-26 13:19:03

0

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

-save-temps

正如詹姆斯所说,汇编器生成一些不错的评论正好这对通知我们的C++代码行抛出的错误。就我而言,它看起来并不接受这样的指令:

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

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

无论如何,这样的问题的解决方案是由詹姆斯提到的:只是不要删除中间文件,以便您可以直接侦察到汇编代码有什么问题。

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