Cygwin GCC 的 Makefile 工程在 Eclipse CDT 中配置符號與路徑自動探索方法

來源:互聯網
上載者:User

首先使用 MinGW GCC 工具集的工程不存在這個問題:

CDT 可以很好的發現安裝的 MinGW 工具集,然後使 MinGW GCC 的 Toolchain 啟用,使其在建立 C/C++ 工程時成為可選的,這樣就可以使用 CDT 自己的產生器產生 makefile。符號與路徑自動探索沒有問題,源碼符號索引(source index)也沒有問題。

符號與路徑自動探索:指的是 C/C++ 程式中根據編譯環境的差異,會在幾個預設的路徑下尋找 .h 檔案和庫檔案,通常標準/RT 庫的標頭檔和庫檔案就放到那裡,所以源碼中用 #include <stdio.h> 就可以直接找到並包含指定的標頭檔,不用指定標準標頭檔 stdio.h 的路徑。另外,編譯器會產生內建的宏符號,比如 C++ 編譯器通常都產生 __cplusplus 宏,內建宏的定義和具體的編譯器關係很大,比如,Cygwin GCC 就有 __CYGWIN__、__GNUC__ 等標識自己編譯環境的宏。

而 Cygwin GCC 的問題恰恰出現在這裡,CDT 不能發現 Cygwin 工具集的安裝,這跟版本有關:早期的 Cygwin 也能被 CDT 自動探索,並啟用 Cygwin GCC 的 Toolchain 選項。可是我用的 Cygwin setup 2.680,已經不能被 CDT(Eclipse 3.4.1,CDT 5.0.1)自動探索了。Cygwin 版本變化對安裝設定最明顯的改變是:變動了標識 Cygwin 安裝的註冊表鍵,而 CDT 就是靠註冊表來發現 Cygwin、MinGW 等工具集的安裝的。從這個 nabble.com
上的文章可以看出點端倪。

我也不想搞註冊表了,只好做 Makefile 類型的 CDT 工程,手頭上還有些自己以前寫的 makefile,改改就能用,工程在大一點就用 autotools 得了。

哪曾知要讓 Makefile 型工程也能使用 CDT 的符號索引,也要費勁腦汁配置一番。

原因還是上面的問題,CDT 不知道 Cygwin 的存在,所以像 #include <stdio.h> 這句在建立符號索引時就會錯(CDT 會表現出波浪的下滑線,並說明:unresolved inclusion),因為 CDT 找不到 stdio.h,看看產生過程中符號與路徑自動探索的結果,在工程 Properties→C/C++ General→Paths and Symbols 中,就明白了——什麼預設 include 路徑和內建宏都沒發現(勾選 Show built-in values)。

當然 CDT 的符號索引和編譯產生過程無關,Cygwin GCC 正常編譯、產生程式,只是在編輯時 CDT 的源碼瀏覽功能削弱了,原本強悍的源碼符號索引 IDE 現在只成了一個高亮文法顯示工具。

幾經折騰後,發現了配置 Makefile 型工程使用 CDT 符號與路徑自動探索的方法,步驟如下:

  1. 工程 Properties→C/C++ Build→Discovery Options 中設定 Discovery profiles scope 為 Configuration-wide(如果沒有就建立這個),注意把下面配置中的 Automate discovery of paths and symbols 勾上,這個就影響工程 Properties 中的 C/C++ General→Paths and Symbols 中的 include 路徑和宏符號的自動探索。

  2. 把 Discovery profile 選擇為 GCC per project scanner info profile,和它平行的是很多 Managed Build System 首碼的 profile。

    Managed Build System 的 profile 對應於 CDT 內建的 make 產生器(叫做 CDT Internal Builder)使用的路徑/符號自動探索設定。而使用 Cygwin 提供的外部 make 工具的方式稱為:Gnu Make Builder,這兩種 builder(產生器)在工程 Properties→C/C++ Build→Tool Chain Editor 能找到線索。

  3. 特別注意:如果你在 Discovery Options 中把 Compiler invocation command 設定為 gcc 或 g++,可能會出錯,而這是 CDT 幫你填的預設編譯命令(黑線……),原因是 Cygwin 中 gcc 和 g++ 可能是個符號連結,只有用 Cygwin 系統/庫構造起來的程式才認識到這是個符號連結,否則 Windows 的程式,包括 CDT 就只當它是個文字檔(用 16 進位編輯器看看 Cygwin 的 ln 建立的符號連結檔案的內容就明白了),此時把一個文字檔當程式運行當然會出錯。解決辦法就是找到
    gcc/g++ 符號連結指向的實際目標編譯器程式,通常是 gcc-4.exe、g++-4.exe 等(4 是版本號碼,視具體情況而定),下來只要設定 gcc-4/g++-4 為編譯命令就行了。

  4. 最後重編譯你的工程,CDT 就會使用 Discovery Options 設定的 gcc 做預設 include 路徑和內建宏發現(方法是對一個空的源檔案做 -E 預先處理展開)。現在你可以看看工程 Properties→C/C++ General→Paths and Symbols 中被 CDT 自動探索的 include 路徑和宏符號了。再看看源碼中的 #include <stdio.h> 標準標頭檔包含,現在也已經自動探索了這些標準標頭檔的位置了。最後,你可就以按著 Ctrl 鍵享受 CDT 強大的源碼符號跳轉了,那是比
    VC IntelliSense,VC + Visual Assist X,Source Insight 等精確地多的源碼符號索引,更何況 CDT 是開源的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.