2011-04-19 82 views
35

我試圖編譯使用Eclipse在Linux的一個簡單的「Hello World」程序,但我總是得到這樣的:文件無法識別:文件截斷GCC錯誤

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 **** 

有沒有人有一個想法是什麼問題是什麼?

回答

63

只需刪除目標文件。

這個錯誤很可能出現在之前的構建被中斷並且目標文件沒有完全生成之後。

+0

是否有任何提示可以避免增量構建?我們的pull請求構建是增量構建,新提交將取消舊的運行構建。我經常遇到這個問題,這將阻止我們的CI系統。 – 2017-04-21 01:49:14

+0

在我的情況下,所說的目標文件不存在仍然它說失敗,因爲截斷.o文件 – Shailesh 2017-07-29 15:20:32

+0

您的CI系統不應該運行增量構建。開發人員無法在每次編輯之後等待乾淨的構建;相反,CI系統無法承擔增量構建所固有的缺乏可靠性。 – marcv81 2017-12-21 09:48:03

0

我覺得

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

在該目錄中我只有這麼hello.cc我不知道它爲什麼說有hello.o – Kobe 2011-04-19 09:03:35

+0

@vbX是它默認生成的文件由eclipse? – 2011-04-19 09:06:07

7

就像一些信息,如果有人來這裏。

另一個問題(具有相同的錯誤)可能是,您正在使用ccache來加快編譯。在這種情況下,損壞的* .o文件也在那裏。因此,對於這個原因,你必須清理與

ccache -C緩存(注意是大寫!C)

浪費我小時在第一時間;-)

+1

您可能不想吹走整個緩存。相反(從手冊頁),您可以從構建目錄中刪除破損的對象文件,然後使用「CCACHE_RECACHE」集進行構建。 – crazyscot 2017-04-05 02:56:09

+1

這是真的,但通常是用多個線程構建(例如-j 10),並且如果您例如用完磁盤空間10,則隨機對象文件將被損壞。因此,您可能會編譯9次,並且每次編譯器將停止在另一個文件上(然後可以從緩存中刪除)。但如果情況並非如此,你的建議當然是對的。 – Rainer 2017-04-06 06:47:48

+0

這節省了我的一天,刪除錯誤中提到的目標文件不會有任何幫助。 – Antonio 2017-10-05 21:37:47

相關問題