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

问题描述 投票:0回答:2

布翁乔鲁诺,

我的 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++ 源文件时会发生这种情况。我有哪些调试选项?

c++ assembly g++
2个回答
3
投票

我将描述我所见过的此类问题的一个可能原因 - 以及解决这些问题的选项。

但是,从问题中提供的信息来看,很难确定没有其他原因(或相应的解决方案)。

此类症状通常是在以不同方式处理“文本”文件(请记住源文件包含文本)的系统(例如 windows 和 unix)之间传输项目源文件的副作用。具体来说,某些(文件)系统要求文本文件在文本文件末尾之前立即有一个换行符(或回车换行符对),而有些系统则不需要。

如果在系统之间传输源文件,而不对此进行纠正,编译器(本质上是一个解析源文件的程序)经常会抱怨诸如在文件末尾之前缺少换行符之类的问题。

文件传输的此问题可能以多种方式发生,例如使用 ftp 和“二进制”模式传输文件、从与创建 tarball 的主机系统不同的 tarball(或其他文件存档)中提取源文件。

通过基于文本的传输可以在一定程度上避免此类问题(例如使用 ftp 以“文本”模式而不是“二进制”模式传输源文件)。

如果文件已经传输,可以使用一些特定的程序,如

dos2unix
(如果文件已从Windows计算机传输到Unix计算机)来修复所有受影响的源文件。或者,可以手动编辑文件(使用任何文本编辑器或大多数 IDE)并在文件末尾添加额外的行。

在构建过程中生成的中间文件(例如,由 C++ 编译器作为中间步骤生成的 asm 文件)中看到这些症状有点不寻常。但是,如果源(C 或 C++)源文件已被传输,某些编译器(或编译器版本或编译器的特定版本)可能会发出汇编器代码,导致汇编器以这种方式发出抱怨。这种情况也可能在传输源文件后发生,这是编译器如何解析源文件以及它做出什么假设(或检查它不这样做)的结果。但修复方法通常是相同的 - 修复生成中间文件的源文件。


3
投票

GCC 的工作原理是将

.cpp
编译为实际的 asm 文件(带有
/usr/lib/gcc/arm-none-eabi/11.2.0/cc1plus
或其他文件),然后在其上运行
as
。 (或通过管道连接到
as
。)

如果 C++ 编译器被终止(因为它在某些服务器上使用了太多的 CPU 时间?),它的 asm 输出将被截断,大概在一行的中间。因此

as
会看到这一点并发出警告,并且您会收到一条有关
cc1plus
编译器正确进程被信号(SIGTERM 或 SIGKILL,而不是编译器错误或崩溃)终止的消息。

不要在进程完成之前终止它们。 (或者不要在执行此操作的服务器上运行测试。或者,如果需要,可以将源文件拆分为多个较小的文件,这些文件可以在超时之前进行编译。)

您没有在问题中提供任何有关该程序在哪里运行或发生了什么的信息,因此很难说任何具体信息。 Jester 能够在评论中

找出问题,指出这是一个 200 万行的 asm 文件。

如果编译此源文件需要大量 RAM,Linux 的 OOM 杀手(内存不足)也是可能的。当内核需要分配更多页面但没有任何可用页面时,它会选择一个占用内存的进程并杀死它,甚至无法通过交换内容来杀死它。

© www.soinside.com 2019 - 2024. All rights reserved.