我正在为VS2012编译一个项目,为Windows编译GCC(CodeBlocks)。 在VS2012上一切都很完美。 在GCC下我得到以下编译错误:
C:UsersPiotrekAppDataLocalTempccfdl0Ye.s|164|Error: invalid use of register| C:UsersPiotrekAppDataLocalTempccfdl0Ye.s|166|Error: invalid use of register| C:UsersPiotrekAppDataLocalTempccfdl0Ye.s|221|Error: invalid use of register| ||=== Build finished: 3 errors, 14 warnings (0 minutes, 0 seconds) ===|
我正在使用编译器选项-fpermissive – 它应该与错误无关。
我只是无法理解为什么它指向Local Temp文件夹下的临时文件,并说我使用了错误的寄存器?
有没有人知道发生了什么?
看起来您在编译器中遇到了一个错误。 错误消息(从“源”文件名判断)来自汇编程序。 汇编程序生成错误消息的唯一时间是汇编程序中存在非法内容,并且C ++编译器永远不应生成非法汇编程序; 如果它不能生成合法的汇编程序,它应该输出错误信息并失败。
当您收到此类消息时,真正的问题是要弄清楚代码中触发它的内容。 g ++有一个选项,告诉它不要删除任何中间文件。 使用它,然后尝试查看这些行的assember文件中发生了什么。 (当你要求g ++输出汇编程序时,它会提供很好的注释以帮助找到相应的源。我不知道在生成汇编程序作为中间文件时它是否也这样做。)然后尝试切割代码(如果更糟的是更糟糕的是,使用二进制搜索)直到你可以得到一行或两行程序的错误。 试着猜出他们的特殊之处,并以不同的方式改变他们做同样的事情。
并且不要将错误报告给g ++。
感谢James Kanze的建议,我决定告诉编译器不要删除临时文件。 这是由旗帜完成的:
– 保存 – 临时工
正如詹姆斯所说,汇编程序会生成一些很好的注释,这些注释可以准确地告知我们的C ++代码中的哪一行引发了错误。 就我而言,看起来它不接受这样的指示:
asm ( ".intel_syntax noprefixn" "lock dec [DWORD PTR eax]n" ".att_syntax n" : : "a" (data) : );
我不知道为什么他不再接受英特尔语法,因为它与以前的GCC版本一起使用,现在我更新了它不再了。
无论如何,这些问题的解决方案是詹姆斯提到的问题:不要删除中间文件,以便你可以直接监视汇编代码有什么问题。
关于INTEL语法的问题,任何想法为什么它不再起作用?
以上就是c/c++开发分享GCC-无效使用Register相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544710.html