1.運行環境Windows xp;Arduino1.6.11 IDE.2.問題在Arduino編譯時,經常出現如下的錯誤: collect2.exe: error: ld returned 5 exit statusexit status 1Error compiling for board Ard... ...
1.運行環境
Windows xp;
Arduino1.6.11 IDE.
2.問題
在Arduino編譯時,經常出現如下的錯誤:
collect2.exe: error: ld returned 5 exit status
exit status 1
Error compiling for board Arduino Duemilanove or Diecimila
打開Arduino中編譯過程顯示的開關,可以知道,編譯文件時沒有錯誤,只是在鏈接時出現了錯誤。自己做一個批處理,在命令行中重新運行出錯的鏈接部分,會彈出一個視窗,是“記憶體不能為讀”錯誤。之後就退出了。

圖1. 在命令行中重新鏈接時彈出的視窗
3.問題的本質
經過錯誤代碼跟蹤,問題不是出在Arduino上,而是在windows XP的ntdll.dll模塊上,Arduino的鏈接程式ld.exe調用了ntdll.dll模塊的功能時出了錯誤,在其中返回(ret)時,進入了無許可權的區域,只有修複ntdll.dll才可以從根本上解決以上問題。在windows xp和windows 7上可能會出現上邊的錯誤,而論壇中說,在windows 10上不會出現上邊的問題。在國外的論壇上有大量的用低版本的Arduino的ld.exe代替的解決方法,可能是低版本的ld.exe不調用ntdll.dll,但是,有的也不好用。

圖2. ntdll.dll模塊內出現的錯誤
4.折中解決方法
經過觀察,雖然鏈接時出現了錯誤,但是,在目標目錄中,已經生成了elf文件,卻沒有hex文件,也就是鏈接時,在生成elf文件後出現了調用ntdll.dll的錯誤, 中止了下邊要進行的elf生成hex文件的工作。
經過分析正確的鏈接過程,使用avr-objcopy,用批處理完成elf文件到hex文件的生成。
創建一個elf2hex.bat文件,把如下內容寫到elf2hext.bat文件中。
"D:\arduino-1.6.11\hardware\tools\avr/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "d:\Arduino_Hex/pelican.ino.elf" "d:\Arduino_Hex/pelican.ino.eep"
"D:\arduino-1.6.11\hardware\tools\avr/bin/avr-objcopy" -O ihex -R .eeprom "d:\Arduino_Hex/pelican.ino.elf" "d:\Arduino_Hex/pelican.ino.hex"
根據你的應用,替換掉pelican文件名,其中d:\Arduino_Hex是Arduino編譯的目標目錄,是自己創建的【1】。
5.使用
(1).先正常使用Arduino編譯,看是否生成elf文件(我的情況是總會生成的),有的時候,有collect2.exe: error: ld returned 5 exit status錯誤。退出了。但是elf文件已經生成。
(2).運行elf2hex.bat文件,在目標中會出現hex文件。
參考:
【1】Arduino設置:http://www.cnblogs.com/hyper99/p/Arduino-UNO-fang-zhen-kai-fa-huan-jing-she-zhi-he-.html