在Ubuntu 16.04 LTS上用g++和gcc編譯C/C++代碼錯誤提示“.../x86_64-linux-gnu/crt1.o: ELF section name out of range”


        (有一些圖片我是直接從個人的CSDN博客上復制來的)

    最近一個多月來,我曾經多次嘗試在Ubuntu 16.04 LTS上使用g++和gcc(這倆好像合起來叫MinGW?)來編譯C/C++代碼,但是在解決所有語法問題后還是會出現錯誤提示

         /usr/bin/ld:error:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:ELF section name out pf range

       圖1 問題出現

    這個問題從我換裝Ubuntu就一直困擾我到現在,期間也有在網上各種搜索,但是都無甚收獲。那句老話說得好,功夫不負有心人,昨天晚上終於被我看到有價值的東西了:https://github.com/yesodweb/yesod/issues/1445

    鏈接內容翻到下面看,前面的說的我試了沒啥用。

   圖2 解決問題的開端

           其實上面這個鏈接就在我用Bing搜索后的第一個備選項,之前應該也有點進去過,但是沒看完。昨天耐着性子把老外寫的東西看了一遍,他大概意思就是要把某個文件夾(文件?)刪了。但我看了自己的目錄,沒有發現雷同的,再結合在不知哪個地方看到的說編譯程序和文件 /usr/lib/x86_64-linux-gnu/crt1.o 有關。一不做二不休,我果斷把它刪了!但是刪了之后又出現了另一個錯誤:

                        /usr/bin/ld:找不到 crt1.o:沒有那個文件或目錄

                                                collect2:error:ld returned 1 exit status

    我又趕緊在 /usr/lib/x86_64-linux-gnu/ 下新建了一個 crt1.o 文件,這回的錯誤是:

                      /usr/lib/x86_64-linux-gnu/crt1.o:無法識別文件:文件被截斷

                           collect2:error:ld returned 1 exit status

        圖3 刪除以及手動建立crt1.o文件后報的錯誤提示

   看來這個只有1.9KB的文件里面的內容是很關鍵的!

圖4 crt1.o文件

    昨天晚上,我跑到隔壁寢室,借用同學的虛擬機,先下載了gccg++(虛擬機居然沒有這兩個必備的編譯器?),又在上面編譯了我打算在自己機子上跑的程序——完美運行!但是當時已經熄燈了,只能等到第二天(就是今天)。概率論下課后馬上回來,一連串暴力復制粘貼的操作后,再次編譯代碼:

圖5 解決問題后成功編譯

    以上結果美中不足的就是輸出亂碼,經過一小番探索是因為字符編碼的問題——我之前是在VC 6.0上寫的代碼,據說VC 6.0(有神仙說Windows系統都是)的編碼格式是 ANSI,而Ubuntu是UTF-8,因此會顯示亂碼。我又立刻vim新建了一個一個文件,再次編譯后:

圖6 最終顯示結果

          這回大功告成!
    總結:      

    遇到“/usr/bin/ld:error:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:ELF section name out pf range”問題時,先到對應目錄(我的是  /usr/lib/x86_64-linux-gnu )把 crt1.o 文件刪(強烈建議備份!)了,再去找另外一台可以正常編譯C/C++代碼的Ubuntu系統的電腦,把上面的 crt1.o 文件拷到對應目錄下,就OK啦!
    gcc不能用來編譯C++代碼噢。
    Windows的編輯器(至少老古董 VC 6.0是)很多默認編碼格式是ANSI,這一點需要注意。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM