【问题标题】:File not recognized: File truncated GCC error文件无法识别:文件被截断 GCC 错误
【发布时间】:2011-08-08 12:07:47
【问题描述】:

我正在尝试使用 Eclipse 在 Linux 中编译一个简单的“Hello World”程序,但我总是得到这个:

Building target: hello
Invoking: GCC C++ Linker
g++  -o "hello"  ./src/hello.o   
./src/hello.o: file not recognized: File truncated
collect2: ld returned 1 exit status
make: *** [hello] Error 1

**** Build Finished ****

有人知道问题出在哪里吗?

【问题讨论】:

    标签: c++ eclipse gcc


    【解决方案1】:

    只需删除目标文件。

    这个错误很可能出现在之前的构建被中断并且目标文件没有完全生成之后。

    【讨论】:

    • 对于增量构建,有什么技巧可以避免这种情况吗?我们的拉取请求构建是增量构建,新的提交将取消旧的运行。我经常遇到这个问题,这会阻塞我们的 CI 系统。
    • 在我的情况下,说目标文件不存在仍然因为 .o 文件被截断而失败
    • 您的 CI 系统不应运行增量构建。开发人员不能在每次编辑后等待干净的构建;相反,CI 系统无法承受增量构建固有的可靠性不足。
    • @markuscornelius,请尊重,不要在我嘴里说什么。我要说的是,通过增量 CI 构建,误报和误报的成本高于更频繁构建所节省的成本。我已经量化并与几个客户确认了这一点,但是我必须承认我的样本偏向于更大的团队。如果您的体验不同,我很想了解更多详情。
    • 仅针对那些在按照答案中提到的步骤后遇到此问题的人,如果您使用诸如cmake 之类的构建系统编译代码,您将拥有更多文件以及目标文件。所以只需删除所有这些,即做rm <objectfile name>.o.*
    【解决方案2】:

    如果有人来这里,作为一个信息。

    另一个问题(同样的错误)可能是您使用ccache 来加快编译速度。在这种情况下,损坏的 *.o 文件也在那里。因此,出于这个原因,您必须使用

    清理缓存

    ccache -C(注意大写C!)

    第一次浪费了我几个小时 ;-)

    【讨论】:

    • 您可能不希望清除整个缓存。相反(从手册页),您可以从构建目录中删除损坏的目标文件,然后使用 CCACHE_RECACHE 设置构建。
    • 确实如此,但通常您使用多个线程构建(例如 -j 10),例如,如果您的磁盘空间不足,则 10 个随机对象文件将被损坏。因此,您很可能编译 9 次,并且每次编译器都会在另一个文件上停止(然后您可以从缓存中删除该文件)。但如果不是这样,你的建议当然是对的。
    • 这节省了我的时间,删除错误中提到的目标文件不会有任何帮助。
    • 对我来说是 ccache -cC
    【解决方案3】:

    我觉得

    g++  -o "hello"  ./src/hello.o  
    should be ./src/hello.(c | cpp | cc depending on your language type)
    

    【讨论】:

    • 在那个目录中我只有 hello.cc 所以我不知道为什么它说 hello.o
    • @vbX 是 Eclipse 生成的默认 make 文件吗?
    猜你喜欢
    • 2017-01-19
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多