assembly C++编译器失败并显示警告:文件结尾不在行尾;已插入新行

9o685dep  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(182)

早上好,
我的C++构建在GCC 10.2上从x86_64到ARM的交叉编译开始失败,

{standard input}: Assembler messages:
{standard input}:2186487: Warning: end of file not at end of a line; newline inserted
arm-linux-gnueabihf-g++: fatal error: Killed signal terminated program cc1plus

我没有任何显式的.asm文件可以在其中追加换行符,这在用g编译C源文件时发生。我有什么选项来调试它?

kx5bkwkv

kx5bkwkv1#

我将描述我所看到的导致此类问题的一个可能原因,以及解决这些问题的方法。
然而,从问题中提供的信息来看,很难确定没有其他原因(或相应的解决方案)。
这样的症状通常是在不同的系统(如windows和unix)之间传输项目源文件的副作用,这些系统处理“文本”文件(记住源文件包含文本)的方式不同。具体来说,一些(文件)系统要求文本文件在文本文件结尾前有一个换行符(或回车换行符对),而一些系统则不要求。
如果在系统之间传输源文件,而不进行纠正,编译器(本质上是一个解析源文件的程序)经常会抱怨文件结尾前缺少换行符。
文件传输的此问题可能以多种方式发生,例如使用ftp和“二进制”模式传输文件,从创建tar球的不同主机系统上的tar球(或其他文件归档)中提取源文件。
这样的问题可以通过基于文本的传输来避免(例如,使用ftp以“文本”模式而不是“二进制”模式传输源文件)。
如果文件已经被传输,一些特殊的程序如dos2unix(如果文件已经从windows机器传输到unix机器)可以用来修复所有受影响的源文件。或者,文件可以手工编辑(使用任何文本编辑器,或大多数IDE),并在文件末尾添加一行。
对于在构建过程中生成的中间文件,看到这些症状有点不寻常(例如,由C编译器作为中间步骤生成的asm文件)。但是,如果源(C或C)源文件已传输,一些编译器(或编译器版本或编译器的特定构建)可能发出导致汇编程序以这种方式抱怨的汇编程序代码。这也可能发生在传输源文件之后,这是编译器解析源文件的方式以及它所做的假设(或检查它没有做的假设)的结果。但修复通常是相同的--修复生成中间文件的源文件。

a7qyws3x

a7qyws3x2#

GCC的工作原理是将.cpp编译成一个实际的asm文件(使用/usr/lib/gcc/arm-none-eabi/11.2.0/cc1plus或其他格式),然后在其上运行as(或者通过管道连接到as)。
如果C++编译器被终止(因为它在某个服务器上占用了太多的CPU时间?),它的asm输出将被截断,大概是在一行的中间。所以as看到这一点并发出警告,你会得到一条消息,关于cc1plus编译器本身的进程被一个信号(SIGTERM,而不是崩溃)终止。
不要在进程完成之前终止它们。(或者不要在这样做的服务器上运行测试。或者如果需要的话,可以将源文件拆分成多个较小的文件,这样可以在超时之前编译。)
你没有在问题中给出任何关于它在哪里运行或者正在发生什么的信息,所以很难给出任何具体的信息。Jester能够在注解中识别出问题,指出它是一个200万行的asm文件。

相关问题