前言
Eclipse 作為一款開源的跨平台的集成開發環境,本身就體現出了開源的強大優勢和跨平台的可移植性。不僅有眾多的開發人員為它開發了不計其數的插件,而且以它為模板進行二次開發的商業IDE也不在少數,比如 Myclipse,Wolfram Mathematica 的 WorkBench 等。同時,它也提供了幾乎對所有語言的開發支持,從主流的 Java,C++,Python 到 及其非主流的 Linden Scripting Language,這種兼容並包的精神是閉源軟件難以望其項背的。雖然說,專一的IDE會給特定項目的開發帶來更加優秀的功能支持,比如 Visual Studio 配合上一些插件 在一定程度上 給用戶帶來的開發體驗要遠遠優於CDT,但對於筆者經常跨平台工作、使用多種語言的開發者來說,也不得不含淚對Visual Studio 說 Goodbye,只得轉戰到 Eclipse 陣營中——Vim嘛,還達不到這么Geek的地步。。。
目標
Eclispse的CDT本身提供了自己的項目格式,.cproject,可以自己設定make方式,但終究在開發者和源代碼之間建立了一個不太透明的隔閡,對於更加細致的編譯要求也很難進行配置,因此筆者要放棄Eclipse的編譯功能,使用 cmake 進行項目編譯工作,Eclipse則從事除了編譯以外的 代碼編寫、項目管理、源碼控制等功能。通過本文,筆者將要展示如何通過Eclipse創建自定義編譯環境,運行環境,調試環境,及自定義錯誤分析器,代碼跳轉等功能。
環境
Scientific Linux 6.1
Eclipse IDE for C/C++ Developers Indigo Service Release 1
cmake version 2.6-patch 4
gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6)
GNU Make 3.81
創建項目
創建一個c++項目,類型選 Makefile project - Empty Project - Other Toolchain,這個目的主要是為了讓Eclipse盡量少的給我們的項目加額外的配置參數。

現在得到一個完全空白的項目,我們給他添加 CMakeLists.txt , main.cpp 和 build.sh 三個文件
為了方便編輯cmake文件,可以下載 CmakeED 插件,它可以提供代碼高亮和提示功能。
我們先來寫一段簡單的 cmake 代碼
# config
cmake_minimum_required(VERSION 1.0)
PROJECT(HelloCMake)
# working directory
SET(PROJECT_BINARY_DIR ${PROJECT_SOURCE_DIR}/build)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
# source
AUX_SOURCE_DIRECTORY(. src)
# target
ADD_EXECUTABLE(HelloCMake ${src})
以及 c++ 程序
#include <iostream>
using namespace std;
int main()
{
int sum=0;
for(int i=0;i<100;++i)
{
sum+=i;
}
cout<<"Hello CMake!"<<endl
<<"Sum is "<<sum<<endl;
}
build.sh 負責編譯我們的程序,你可下載 ShellED 來輔助編輯 shell script
我們的編譯命令如下
#! /bin/bash dir=build/HelloCMake_obj if [ ! -d $dir ]; then mkdir -p $dir fi cd $dir cmake ../.. make -j2
編譯配置
打開項目屬性,在 C++ Build 選項頁的 Builder Settings里,去掉 Use default build command,在 Build command 里輸入 ${ProjDirPath}/build.sh

ok。
在build前要記着給 build.sh 加上 可執行 屬性,chmod +x ~/develop/eclipse/HelloCMake/build.sh
然后build,之后輸出窗口中就會顯示出來我們的自定義build結果

運行程序
我們的 可執行程序 並不是輸出在正常目錄里,因此 CDT 不會給我們生成自動的運行命令,我們需要自己設置;因為我們生成的甚至不一定是c++程序,因此使用自定義 Extern Tool 比自定義Run 更合適。
打開 Extern Tools Configuration,在 Progam 里新建一個命令,在 Location 里選擇可執行程序命令,比如 ${workspace_loc:/HelloCMake/build/HelloCMake}。Work Directory是程序的啟動路徑,程序代碼中使用 . 和 .. 進行路徑查找時就是相對於這個目錄;因此在 Visual Studio里開發程序有時會發現,在 vs 里運行程序沒問題,但是進入程序文件夾運行程序出bug了,就是因為兩種方式設置的 Work Directory不同。
最好把Build 選項卡里的 Build before lauch選項去掉;因為我們的程序現在已經不再局限在這一個項目中,而是以 WorkSpace作為參考系的,因此這個選項會導致編譯整個WorkSpace,所以根據自己情況選擇是否保留這個選項。
然后運行這個外部工具,就會看到我們的運行結果了。
錯誤分析器
我們給程序隨便加點 bug,比如把 int sum 改成 int Sum,再編譯程序就會出錯了。因為在我們的build.sh 中,使用的都是標准工具,所以編譯錯誤都被CDT直接識別出來了。在這點上,省卻了我們不少麻煩。
打開項目屬性,打開 C/C++ Build - Settings - Error Parsers,這里就是系統內嵌的標准分析器,它們的工作原理很簡單,對 CDT console 的每一行輸出進行正則表達式匹配,然后把匹配的組映射為文件、行、原因等參數,然后被 Probelm 接收。
如果我們的編譯工具非主流,它的輸出不符合上述分析器提供的功能,我們就沒法根據輸出定位錯誤位置了;這時,我們就可以自定義自己的 Error Parsers 來執行這項工作。
我們把程序改回去,而是給 CMakeLists 加點錯誤。
然后我們會得到類似的輸出

這里有一些 CMake 錯誤,但是分析器無法分析;我們就需要自己來實現。
首先這里有點局限,就是 CDT 的 Error Parsers 是基於行的,但是 CMake 的錯誤,每一條都是分成三行來提供的,這就很麻煩了,無法把它們合並成一條錯誤。
我們回到Error Parsers 界面,下面有個 WorkSpace Settings 鏈接,打開它,我們可以創建一個 CMake Parser

然后,你可以仿造其他的parser,創建 cmake 輸出的分析器,比如如下兩個規則

在項目屬性里選擇這個parser,然后重新生成,看看輸出是不是變顏色了?同時,Problem里也有了信息

其中前兩個就是我們剛剛分析出來的,是不是很簡單?美中不足就是無法把這兩條合並,可惜啊。。。
代碼跳轉
這個本來是非常基本的功能,ctrl+click 可以跳轉到類聲明,打開頭文件等,可以說是非常基本實用的功能,但是我們使用了自己的編譯器后,上述功能就失效了,不如你點擊 iostream,狀態欄里居然說無法這個文件。這是怎么回事呢?
其實,代碼跳轉這個功能,是 Eclipse Indexer 系統的一個子功能,包括代碼重構,符號搜索,都是在這個系統里的。我們在編譯程序時,需要指定頭文件、庫文件的搜索路徑,Indexer同樣需要知道這些信息。
使用 CDT 的標准項目時,這兩個路徑通過同一個地方指定,因此說,項目能夠編譯鏈接成功,Indexer也就能把符號表建立起來了,也就擁有了代碼跳轉、重構等功能。我們雖然不需要使用 CDT 的編譯功能,但是為了 Indexer,上述路徑還是要指定的。
在 項目屬性中,打開 C/C++ General - Paths and Symbols - Includes 選項卡里,添加常用路徑

然后再試試代碼跳轉功能,oh yeah!
最后的戰役 - 調試
其實這已經很簡單了,和配置 Extern Tools 類似,把 可執行程序,工作路徑,源代碼搜索路徑配置好就ok了,只是要把程序編譯成 Debug 版本,否則 gdb 無法加載符號表——在 CMakeLists 中加入 SET( CMAKE_BUILD_TYPE Debug ) 選項 就可以了
至此,我們就建立起了一個完善的自定義工具開發環境,是不是比原來自帶的項目模板還順手?更多功能,還是需要你自己親自摸索吧~~
