2012年11月10日 星期六

解決「Eclipse 出現 Unresolved inclusion: <...>」問題

在用 Eclipse-CDT 開發程式時,偶而會出現『Unresolved inclusion: <...>』的訊息,有時也伴隨著一些變數型態宣告也出現『Type '...' can not be resolved』。
雖然,可以順利編譯,不會出現錯誤訊息。執行也都正常,完全不像是『語法錯誤』或『宣告的標頭檔(header file)不存在」所造成的。但是,看起來很礙眼,很想除之而後快。
    經過 Google 的查詢協助,可以得知這個問題是 Eclipse-CDT 的設定所造成的。網路上提供的修正,多是將 #include <...> 的 header 檔所在的目錄,加入到 Eclipse-CDT 的設定中。
    可是,在筆者的認知中,基本的 C 之 header 檔所在的目錄是不需設定的,只有使用額外的函式庫(如:OpenCV)時,才需要在專案的設定裏加入 include 的目錄路徑,或函式庫的鏈結時的目錄路徑。
    所以,問題一定是發生在一個「應預設設定」而「未設定」的地方。經過嘗試,發現了這個「應設定而未設定」的問題,在修改這個設定後,再做些專案整理操作,即可去除這個『Unresolved inclusion: <...>』的問題。

一、設定專案的 C 語言路徑設定

從「專案」→「內容」→左欄的「C/C++ General」→「Preprocessor Include Paths, Macros etc.」,再勾選右欄中的「Enable language setting providers for this project」後,點選「套用」和「確定」。

二、專案整理、清除之前的錯誤記錄

光是修改上個設定還是不能排除這個訊息,還要將之前的記錄清除才可。
  • 在 Eclipse 的專案瀏覽器中,在欲修正的專案名稱上按「滑鼠右鍵」,出現一個專案操作選單,點選「Clean Project」以清除之前的專案記錄。
  • 重覆上一操作,但在專案操作選單中,點選「關閉專案」。
  • 重覆上一操作,再在專案操作選單中,點選「開啟專案」。
    這時『Unresolved inclusion: <...>』的訊息應該已經清除了,但是,可能有些『Type '...' can not be resolved』訊息仍然存在。
  • 重覆上一操作,在專案操作選單中,點選「Index」→「Rebuild」以重建 include 內的宣告記錄。這一來,Eclipse-CDT 就不會找不到變數的型態宣告了。
經過上述修正後,就可以得到一個清爽的畫面了。

三、可能發生原因、如何避免

當然所有發生的原因我不可能都知道,只能就筆者的使用經驗做些結論:
  • 使用「匯入」將專案加入目前的「工作空間」(Work Space),因為「匯入」前的專案設定,未必完全轉移到這個開發中的「工作空間」,且 Eclipse-CDT 未能以預設的「專案型態」正確設定這些值。
  • 建立新的專案時,未以正確的「專案型態」(Project Type)開設專案。
  • 更新或升級 Eclipse 後,新的預設值與原來不同。
    :幾年前,有次用『 yum update 』更新後,連專案都開不了。最後將 Eclipse 的設定『 ~/.eclipse 』全部清除,才得以順利開啟;之後的更新都沒再出現類似狀況。
那如何避免發生這個問題,至少筆者依之前發文 “在 Linux 中,用 Eclipse 寫第一個程式 HelloWorld” 的步驟所建立的專案,都未發現這個訊息。

注意:不會產生此訊息的新建立專案的型態為:『Executable』,Toolchains 為『Linux GCC』。

已測試版本:

  • Fedora 17 + Eclipse 4.2.1

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)