问题合集 ------- 用 Eclipse 平台进行 C/C++ 开发
簡介:?我們將概述如何在 C/C++ 開發(fā)項(xiàng)目中使用 Eclipse 平臺。盡管 Eclipse 主要是一個 Java 開發(fā)環(huán)境,但其體系結(jié)構(gòu)確保了對其它編程語言的支持。在本文中,您將學(xué)習(xí)如何使用 C/C++ 開發(fā)工具箱(C/C++ Development Toolkit,CDT),它是可用于 Eclipse 的最佳 C/C++ 工具箱。
本文的標(biāo)簽:??c,?cpp,?eclipse,?ecllipse,?linux,?用eclipse平臺進(jìn)行c_c__開發(fā)
--------------------------------------------------------------------------------------------------------------------------------------------------------------
C 和 C++ 語言都是世界上最流行且使用最普遍的編程語言, 因此 Eclipse 平臺(Eclipse Platform)提供對 C/C++ 開發(fā)的支持一點(diǎn)都不足為奇。 因?yàn)?Eclipse 平臺只是用于開發(fā)者工具的一個框架,它不直接支持 C/C++;它使用外部插件來提供支持。 本文將向您演示如何使用 CDT — 用于 C/C++ 開發(fā)的一組插件。CDT 項(xiàng)目(有關(guān)鏈接, 請參閱本文后面的?參考資料一節(jié))致力于為 Eclipse 平臺提供功能完全的 C/C++ 集成開發(fā)環(huán)境(Integrated Development Environment,IDE)。 雖然該項(xiàng)目的重點(diǎn)是 Linux,但它在可使用 GNU 開發(fā)者工具的所有環(huán)境(包括 Win32(Win 95/98/Me/NT/2000/XP)、QNX Neutrino 和 Solaris 平臺)中都能工作。
CDT 是完全用 Java 實(shí)現(xiàn)的開放源碼項(xiàng)目(根據(jù) Common Public License 特許的),它作為 Eclipse SDK 平臺的一組插件。這些插件將 C/C++ 透視圖添加到 Eclipse 工作臺(Workbench)中, 現(xiàn)在后者可以用許多視圖和向?qū)б约案呒壘庉嫼驼{(diào)試支持來支持 C/C++ 開發(fā)。
由于其復(fù)雜性,CDT 被分成幾個組件,它們都采用獨(dú)立插件的形式。 每個組件都作為一個獨(dú)立自主的項(xiàng)目進(jìn)行運(yùn)作,有它自己的一組提交者、錯誤類別和郵件列表。 但是,所有插件都是 CDT 正常工作所必需的。 下面是 CDT 插件/組件的完整列表:
- 主 CDT 插件(Primary CDT plug-in)是“框架”CDT 插件。
- CDT 功能 Eclipse(CDT Feature Eclipse)是 CDT 功能組件(Feature Component)。
- CDT 核心(CDT Core)提供了核心模型(Core Model)、CDOM 和核心組件(Core Component)。
- CDT UI是核心 UI、視圖、編輯器和向?qū)А?
- CDT 啟動(CDT Launch)為諸如編譯器和調(diào)試器之類的外部工具提供了啟動機(jī)制。
- CDT 調(diào)試核心(CDT Debug Core)提供了調(diào)試功能。
- CDT 調(diào)試 UI(CDT Debug UI)為 CDT 調(diào)試編輯器、視圖和向?qū)峁┝擞脩艚缑妗?
- CDT 調(diào)試 MI(CDT Debug MI)是用于與 MI 兼容的調(diào)試器的應(yīng)用程序連接器。
現(xiàn)在,讓我們研究一下如何在實(shí)際應(yīng)用程序中使用這些組件。圖 1 顯示了 Eclipse 中的 C/C++ 項(xiàng)目:
圖 1. 在帶有 CDT 插件的 Eclipse 中編輯 C/C++ 項(xiàng)目
安裝和運(yùn)行 CDT
在下載和安裝 CDT 之前,首先必需確保 GNU C 編譯器(GNU C compiler,GCC)以及所有附帶的工具(make、binutil 和 GDB)都是可用的。 如果正在運(yùn)行?Linux,只要通過使用適用于您分發(fā)版的軟件包管理器來安裝開發(fā)軟件包。 在?Windows平臺上,將需要安裝 Cygwin 工具箱(請參閱?參考資料以獲得鏈接)。Cygwin 是用于 Windows 的類 UNIX 環(huán)境,它包括 GCC 移植以及所有必需的開發(fā)工具,包括 automake 和 GNU 調(diào)試器(GNU Debugger,GDB)。Cygwin 是在?cygwin1.dll?庫基礎(chǔ)上構(gòu)建的。Cygwin 的備用解決方案是 Minimalist GNU for Windows(MinGW)(請參閱?參考資料以獲得鏈接)。 該工具是一組可免費(fèi)獲取、自由分發(fā)的特定于 Windows 的頭文件和導(dǎo)入庫,這些頭文件和導(dǎo)入庫與 GNU 工具集(它們允許您生成不依賴于任何第三方 DLL 的本機(jī) Windows 程序)結(jié)合在一起。 如果您想要創(chuàng)建與 POSIX 兼容的 Windows 應(yīng)用程序,那么 MinGW 是最佳選擇。MinGW 甚至可以在 Cygwin 安裝之上工作。?Solaris和?QNX要求您從因特網(wǎng)下載并安裝其特定的 GCC、GNU Make binutils 和 GDB 移植(請參閱?參考資料以獲得鏈接)。
假設(shè)您安裝了適當(dāng)?shù)?Java SDK/JRE 和 Eclipse 平臺 SDK,并且它們都正常運(yùn)行。CDT 以兩種“方式”可用:穩(wěn)定的發(fā)行版和試運(yùn)行版(nightly build)。 試運(yùn)行版未經(jīng)完全測試,但它們提供了更多的功能并改正了當(dāng)前錯誤。 安裝之前,請檢查磁盤上是否存在先前版本的 CDT,如果存在,請確保完全除去它。 因?yàn)?CDT 沒有可用的卸載程序,所以需要手工除去它。 為了檢查先前版本是否存在,轉(zhuǎn)至 CDT 插件所駐留的目錄:?eclipse/plugins?。 接著,除去所有以?org.eclipse.cdt?名稱開頭的目錄。需要做的最后一件事情是從?workspace/.metadata/.plugins?和?features?除去 CDT 元數(shù)據(jù)目錄?or.eclipse.cdt.*?。
下一步是下載 CDT 二進(jìn)制文件。注意:請下載適合于您操作系統(tǒng)的正確的 CDT。遺憾的是,即使 CDT 是用 Java 編寫的,它也不是與平臺無關(guān)的。 接著,將歸檔文件解壓到臨時目錄中,從臨時目錄將所有插件目錄內(nèi)容都移到 Eclipse?plugins?子目錄。還需要將features?目錄內(nèi)容移到 Eclipse?features?子目錄中。現(xiàn)在,重新啟動 Eclipse。Eclipse 再次啟動之后, 更新管理器將告訴您它發(fā)現(xiàn)了更改并詢問您是否確認(rèn)這些更改。 現(xiàn)在您將能夠看到兩個可用的新項(xiàng)目:C 和 C++。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
創(chuàng)建新項(xiàng)目
在 Eclipse 中安裝 CDT 之后, 瀏覽至?File => New => Project,在那里,您將發(fā)現(xiàn)三個新的可用項(xiàng)目類型:C(“Standard C Make Project”)、C++(“Standard C++ Make Project”)和“Convert to C or C++ Projects”。 從“Standard Make C++ Project”開始,為您的項(xiàng)目創(chuàng)建源代碼文件。在 C/C++ Projects 視圖中,單擊鼠標(biāo)右鍵,然后選擇?New => Simple => File。命名您的文件并保存它。您可能會用這種方法創(chuàng)建許多頭文件以及 C/C++ 實(shí)現(xiàn)代碼文件。 最后當(dāng)然是 Makefile,GNU Make 將使用它來構(gòu)建二進(jìn)制文件。對該 Makefile 使用常見的 GNU make 語法(請參閱?參考資料)。 請記住:Makefile 要求您使用 Tab 字符而不是空格來產(chǎn)生縮進(jìn)行。
您通常會將現(xiàn)有的源代碼導(dǎo)入 Eclipse(請參閱圖 2)。CDT 為執(zhí)行這一操作提供了一種便捷的方法:即使用 Import 向?qū)?#xff0c;將文件從文件系統(tǒng)目錄復(fù)制到工作臺。轉(zhuǎn)至主菜單欄,選擇?File => Import => File System。單擊?Next,打開源目錄,選擇您想要添加文件的目錄。 單擊?Select All?以選擇目錄中的所有資源,然后從頭到尾檢查,取消選擇您不打算添加的那些資源。 指定將作為導(dǎo)入目標(biāo)的工作臺項(xiàng)目或文件夾。還可以通過從文件系統(tǒng)拖動文件夾和文件并將它們放入 Navigator 視圖中, 或者通過復(fù)制和粘貼來導(dǎo)入文件夾和文件。
圖 2. 將現(xiàn)有的源代碼導(dǎo)入 CDT 項(xiàng)目
--------------------------------------------------------------------------------------------------------------------------------------------------------------
關(guān)鍵的 CDT IDE 功能
CDT IDE 是在 CDT UI 插件所提供的通用可擴(kuò)展編輯器基礎(chǔ)上構(gòu)建的。然而,該模塊仍處于開發(fā)階段,所以它仍缺少一些重要的實(shí)用程序, 如類瀏覽器或語言文檔瀏覽器。CDT IDE 的主要功能是:
- 語法突出顯示:CDT IDE 識別 C/C++ 語法,并為語法突出顯示提供了完全可配置的代碼著色以及代碼格式化功能:
圖 3. 不成功的編譯之后突出顯示的語法錯誤標(biāo)記
- 提綱:Outline 窗口模塊提供了有關(guān)出現(xiàn)在源代碼中的過程、變量、聲明以及函數(shù)的快速視圖。 利用 outline,您可以方便地找到源代碼中的適當(dāng)引用,或者甚至搜索所有項(xiàng)目源代碼。
- 代碼輔助:這個代碼完成功能類似于可在 Borland C++ Builder 或 MS Visual Studio 中找到的功能。 它使用了?代碼模板,并且只有助于避免愚蠢的語法錯誤:
圖 4. 有助于使用正確的語言語法的代碼輔助功能
- 代碼模板:由代碼輔助功能使用的代碼模板是標(biāo)準(zhǔn) C/C++ 語言語法結(jié)構(gòu)的定義。您也可以定義自己的代碼模板來擴(kuò)展您自己的快捷鍵,如用于?author?或?date?關(guān)鍵字的快捷鍵。在?Window => Preferences => C/C++ => Code Templates?中,可以添加新模板并查看完整的模板列表。 也可以將模板作為 XML 文件導(dǎo)出和導(dǎo)入。
圖 5. 預(yù)定義的 C/C++ 代碼模板?
- 代碼歷史記錄:即使您沒有使用 CVS 或其它源代碼版本管理軟件,也可以跟蹤項(xiàng)目源代碼中的本地更改。 在選擇的文件上單擊鼠標(biāo)右鍵,從上下文菜單選擇?Compare With => Local History...:
圖 6. 用 Local History 功能檢查源代碼中的更改
--------------------------------------------------------------------------------------------------------------------------------------------------------------
構(gòu)建并運(yùn)行項(xiàng)目
CDT 提供了一種設(shè)置項(xiàng)目構(gòu)建選項(xiàng)的簡單方法。CDT 依賴于三個 GNU 工具:GCC、GDB 和 Make。因此,對用于調(diào)試的 GDB 或用于編譯的 GCC 和 Make 的依賴要求這些應(yīng)用程序可用于用戶想要使用的平臺。 大多數(shù) Linux(通常和類 POSIX)源代碼軟件包使用 autoconf 腳本來檢查構(gòu)建環(huán)境, 所以您必需運(yùn)行?configure?命令,該命令在編譯之前創(chuàng)建“Makefile”。CDT 沒有提供編輯 autoconf 腳本的方法,所以必需手工編寫它們;然而,您可以配置構(gòu)建選項(xiàng)以在編譯之前調(diào)用?configure?命令。
如果通過調(diào)用?make?命令來構(gòu)建項(xiàng)目, 那么缺省設(shè)置沒問題,但是,如果使用一種更復(fù)雜的方法進(jìn)行構(gòu)建,則必需在 Build Command 文本框中 輸入適當(dāng)?shù)拿?#xff08;例如,?make -f make_it_all?)。接下來,在 C/C++ Projects 視圖中,選擇?C/C++ project,然后單擊鼠標(biāo)右鍵并選擇?Rebuild Project。所有來自 make、編譯器和鏈接程序的編譯消息都被重定向到控制臺窗口:
圖 7. 帶編譯器輸出的控制臺窗口
編譯成功之后, 您或許想要運(yùn)行您的應(yīng)用程序。所有用于運(yùn)行和調(diào)試的選項(xiàng)都位于主 Eclipse 菜單的 Run 菜單下。 然而,必須在早期定義用于運(yùn)行項(xiàng)目的選項(xiàng)。可以通過轉(zhuǎn)至主菜單(在那里,有用于運(yùn)行應(yīng)用程序的不同概要文件)中的?Run...?選項(xiàng)來完成這一步;例如,可以將一個概要文件用于測試目的,而將另一個概要文件用于運(yùn)行最終版本。 另外,可以定義希望要傳遞給應(yīng)用程序的參數(shù),或者可以設(shè)置環(huán)境變量。 其它選項(xiàng)用于設(shè)置調(diào)試選項(xiàng),例如使用哪個調(diào)試器(GNU GDB 或 Cygwin GDB)。 圖 8 顯示了正在為項(xiàng)目創(chuàng)建運(yùn)行概要文件(run profile)。
圖 8. 為項(xiàng)目創(chuàng)建運(yùn)行概要文件
當(dāng)進(jìn)入 C/C++ Projects 視圖,選擇您的項(xiàng)目,單擊鼠標(biāo)右鍵并在 Build Settings 選項(xiàng)卡上選擇?Properties?之后,就可以使用更多的用于構(gòu)建項(xiàng)目的常用選項(xiàng)。這些選項(xiàng)主要影響因遇到編譯錯誤而使構(gòu)建停止時所發(fā)生的情況。
調(diào)試 C/C++ 項(xiàng)目
CDT 擴(kuò)展了標(biāo)準(zhǔn)的 Eclipse Debug 視圖, 使之具備了調(diào)試 C/C++ 代碼的功能。Debug 視圖允許您在工作臺中管理程序的調(diào)試或運(yùn)行。要開始調(diào)試當(dāng)前項(xiàng)目,只要切換到 Debug 視圖, 您將能夠在代碼中設(shè)置(并在執(zhí)行過程中隨時更改)斷點(diǎn)/監(jiān)測點(diǎn)并跟蹤變量和寄存器。Debug 視圖顯示正在調(diào)試的每個目標(biāo)的暫掛線程的堆棧框架。 程序中的每個線程都作為樹中的一個節(jié)點(diǎn)出現(xiàn),Debug 視圖顯示正在運(yùn)行的每個目標(biāo)的進(jìn)程。
Eclipse 通過 CDT 調(diào)試 MI(CDT Debug MI)插件(其組件之一)支持與機(jī)器接口(Machine Interface,MI)兼容的調(diào)試器。 但 MI 調(diào)試器究竟是什么呢?通常情況下,象 ddd 和 xxgdb(請參閱?參考資料以獲得鏈接)之類的第三方 GUI 調(diào)試器在實(shí)現(xiàn)調(diào)試功能時都依賴于 GDB 的命令行接口(Command Line Interface,CLI)。 遺憾的是,經(jīng)過證實(shí)該接口非常不可靠。GDB/MI 提供了一種新的面向機(jī)器的接口, 它非常適合于想要直接解析 GDB 輸出的程序。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
結(jié)束語
C/C++ 開發(fā)工具箱(CDT)提供了一組功能強(qiáng)大的插件,這些插件可以幫助您用 Eclipse 開發(fā) C/C++ 應(yīng)用程序。雖然 CDT 仍處于開發(fā)階段, 但您可以利用其現(xiàn)有的諸多功能。
參考資料
- 您可以參閱本文在 developerWorks 全球站點(diǎn)上的?英文原文.?
- 請加入 Eclipse 平臺社區(qū),并從?eclipse.org下載該平臺。Eclipse 平臺源代碼是根據(jù) Common Public License 特許的。在 eclipse.org 上,您還將找到有關(guān) Eclipse 項(xiàng)目的術(shù)語詞匯表和描述,以及技術(shù)文章和新聞組。Eclipse 平臺白皮書詳細(xì)描述了 Eclipse 的主要組件和功能。?
- 從 eclipse.org 下載?CDT 項(xiàng)目的組件。?
- 請?jiān)L問 eclipse.org 上的?新聞組, 以獲取與 C/C++ 插件相關(guān)的技術(shù)討論和問題。?
- 開發(fā)人員可以通過為該項(xiàng)目中每個組件所創(chuàng)建的?開發(fā)人員郵件列表(developer mailing lists)來參與和 C/C++ IDE 實(shí)現(xiàn)相關(guān)的討論。?
- CDT 項(xiàng)目使用 bugzilla 作為其錯誤和功能跟蹤系統(tǒng)。 在 Eclipse?bugzilla 頁上輸入錯誤/功能報(bào)告與填寫 Web 表單一樣簡單。?
- 有關(guān) Eclipse 平臺及其工作原理的入門文章,請參閱由 Greg Adams 和 Marc Erickson 合著的?developerWorks文章“Working the Eclipse Platform”。?
- 要開始使用 Eclipse 平臺開發(fā)應(yīng)用程序,請參閱由 David Gallardo 撰寫的?developerWorks文章“?Getting started with the Eclipse Platform”。?
- 如果您有興趣創(chuàng)建自己的 Eclipse 插件,請參閱由 David Gallardo 撰寫的?developerWorks文章“?開發(fā) Eclipse 插件”。?
- 從 Red Hat 下載?Cygwin 工具箱。?
- 從 MinGW.org 下載?MinGW 工具箱。?
- 在 gnu.org 上學(xué)習(xí)有關(guān)?GNU make 語法的更多知識。?
- 從 gnu.org 下載?dddGUI 調(diào)試器。?
- 下載?xxgdbGUI 調(diào)試器。?
- 請?jiān)L問?WebSphere Studio Plug-in Central,以獲取已被驗(yàn)證為“Ready for WebSphere Studio Software”的插件的目錄。?
- 學(xué)習(xí) IBM WebSphere Studio 工具的一個擴(kuò)展, 它提供了有助于您使用這些工具的信息和工具。 由于所有 WebSphere Studio 工具都基于 WebSphere Studio 工作臺(WebSphere Studio Workbench),而工作臺基于 Eclipse 框架, 所以很容易通過使用 Eclipse 幫助擴(kuò)展功能來擴(kuò)展產(chǎn)品文檔。 請參閱文章“?Adding Self-Help Support to WebSphere Studio Tools by Extending their Eclipse Help Systems”。?
- 請?jiān)?developerWorks上查找更多的?Eclipse 用戶參考資料。?
================================================================================================================
其他Eclipse技巧:
代碼自動對齊: ctrl+shift+f
行注釋/銷注釋:?Ctrl+/?
塊注釋/銷注釋: Ctrl+Shift+/ ? Ctrl+Shift+\
查找 查找替換: Ctrl+H ?Ctrl+F
查找下一個/往回找: Ctrl+K ? Ctrl+Shift+K
跳到某行: Ctrl+L
查找當(dāng)前元素的聲明: Ctrl+G
查找當(dāng)前元素的所有引用: Ctrl+Shift+G
快速修正: Ctrl+1
引入某個類(接口):ctrl + shift + m
加頭注釋: shift + alt + j
ctrl ?+ ?shift ?+ ?g:查看引用 ?
ctrl ?+ ?shift ?+ ?n:重命名 ?
ctrl ?+ ?shift ?+ ?o:導(dǎo)入類 ?
ctrl ?+ ?shift ?+ ?r:啟動上次運(yùn)行 ?
ctrl ?+ ?shift ?+ ?f:格式化代碼 ?
ctrl ?+ ?c:復(fù)制 ?
ctrl ?+ ?v:粘貼 ?
ctrl ?+ ?x:切剪 ?
ctrl ?+ ?a:全選 ?
ctrl ?+ ?f:查找 ?
ctrl ?+ ?z:撤銷 ?
ctrl ?+ ?y:重做 ?
ctrl ?+ ?s:保存 ?
--------------------------------------------------------------- ?
?
用的最多的應(yīng)該就是CTRL+SHIFT+S ?
還有格式化用的也挺多。 ?
--------------------------------------------------------------- ?
?
ctrl ?+ ?shift ?+ ?f ?格式化代碼 ?
ctrl ?+ ?shift ?+ ?o ?組織導(dǎo)入 ?
F3 ? ?打開聲明 ?
Alt ?+ ?shift ?+ ?r ? ?重命名變量 ?
?
--------------------------------------------------------------- ?
?
up ?
--------------------------------------------------------------- ?
?
Alt+/ ? ? ? ?
?
--------------------------------------------------------------- ?
?
alt ?+ ?left ?
alt ?+ ?right ?
ctrl ?+ ?q ?
--------------------------------------------------------------- ?
?
ctrl ?+ ?shift ?+ ?g:查看引用 ?
ctrl ?+ ?shift ?+ ?n:重命名 ?
ctrl ?+ ?shift ?+ ?f:格式化代碼 ?
ctrl ?+ ?c:復(fù)制 ?
ctrl ?+ ?v:粘貼 ?
ctrl ?+ ?a:全選 ?
ctrl ?+ ?f:查找 ?
ctrl ?+ ?z:撤銷 ?
ctrl ?+ ?s:保存 ?
Alt ? ?+ ?/ ?智能提示 ?
--------------------------------------------------------------- ?
?
ctrl ?+ ?shift ?+ ?g:查看引用 ?
ctrl ?+ ?shift ?+ ?n:重命名 ?
ctrl ?+ ?shift ?+ ?o:導(dǎo)入類 ?
ctrl ?+ ?shift ?+ ?r:啟動上次運(yùn)行 ?
ctrl ?+ ?shift ?+ ?f:格式化代碼 ?
ctrl ?+ ?c:復(fù)制 ?
ctrl ?+ ?v:粘貼 ?
ctrl ?+ ?x:切剪 ?
ctrl ?+ ?a:全選 ?
ctrl ?+ ?f:查找 ?
ctrl ?+ ?z:撤銷 ?
ctrl ?+ ?y:重做 ?
ctrl ?+ ?s:保存 ?
Alt ? ?+ ?/ ?智能提示 ?
F3 ? ?打開聲明 ?
Alt ?+ ?shift ?+ ?r ? ?重命名變量 ?
其實(shí)最常用的就是下面幾個: ?
?
ctrl ?+ ?shift ?+ ?o:導(dǎo)入類 ?
?
ctrl ?+ ?shift ?+ ?f:格式化代碼 ?
ctrl ?+ ?c:復(fù)制 ?
ctrl ?+ ?v:粘貼 ?
ctrl ?+ ?x:切剪 ?
ctrl ?+ ?z:撤銷 ?
ctrl ?+ ?s:保存 ?
Alt ? ?+ ?/ ?智能提示 ?
?
--------------------------------------------------------------- ?
?
Ctrl+M: ?工作區(qū)最大化/最小化 ?
Alt+/: ? ?智能提示 ?
F3: ? ? ? ? ?察看聲明 ?
Crtl+1: ?修正錯誤 ?
?
Shift+Alt+T: ?重構(gòu) ?
Shift+Alt+M: ?提取函數(shù) ?
Shift+Alt+R: ?重命名 ?
Shift+Alt+C: ?更改函數(shù)標(biāo)記 ?
?
Ctrl+Shitf+F: ?格式化代碼 ?
?
--------------------------------------------------------------- ?
?
ctrl ?+ ?shift ?+ ?o:導(dǎo)入類 ?
atl ?+ ?/:提示 ?
ctrl ?+ ?shift ?+ ?t:查找相關(guān)信息 ?
--------------------------------------------------------------- ?
?
Eclipse快捷鍵指南 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
編輯 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
全局 ? ? ? ? ? ?查找并替換 ? ? ? ? ? ?Ctrl+F ?
文本編輯器 ? ? ? ? ? ?查找上一個 ? ? ? ? ? ?Ctrl+Shift+K ?
文本編輯器 ? ? ? ? ? ?查找下一個 ? ? ? ? ? ?Ctrl+K ?
全局 ? ? ? ? ? ?撤銷 ? ? ? ? ? ?Ctrl+Z ?
全局 ? ? ? ? ? ?復(fù)制 ? ? ? ? ? ?Ctrl+C ?
全局 ? ? ? ? ? ?恢復(fù)上一個選擇 ? ? ? ? ? ?Alt+Shift+↓ ?
全局 ? ? ? ? ? ?剪切 ? ? ? ? ? ?Ctrl+X ?
全局 ? ? ? ? ? ?快速修正 ? ? ? ? ? ?Ctrl1+1 ?
全局 ? ? ? ? ? ?內(nèi)容輔助 ? ? ? ? ? ?Alt+/ ?
全局 ? ? ? ? ? ?全部選中 ? ? ? ? ? ?Ctrl+A ?
全局 ? ? ? ? ? ?刪除 ? ? ? ? ? ?Delete ?
全局 ? ? ? ? ? ?上下文信息 ? ? ? ? ? ?Alt+? ?
Alt+Shift+? ?
Ctrl+Shift+Space ?
Java編輯器 ? ? ? ? ? ?顯示工具提示描述 ? ? ? ? ? ?F2 ?
Java編輯器 ? ? ? ? ? ?選擇封裝元素 ? ? ? ? ? ?Alt+Shift+↑ ?
Java編輯器 ? ? ? ? ? ?選擇上一個元素 ? ? ? ? ? ?Alt+Shift+← ?
Java編輯器 ? ? ? ? ? ?選擇下一個元素 ? ? ? ? ? ?Alt+Shift+→ ?
文本編輯器 ? ? ? ? ? ?增量查找 ? ? ? ? ? ?Ctrl+J ?
文本編輯器 ? ? ? ? ? ?增量逆向查找 ? ? ? ? ? ?Ctrl+Shift+J ?
全局 ? ? ? ? ? ?粘貼 ? ? ? ? ? ?Ctrl+V ?
全局 ? ? ? ? ? ?重做 ? ? ? ? ? ?Ctrl+Y ?
? ?
查看 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
全局 ? ? ? ? ? ?放大 ? ? ? ? ? ?Ctrl+= ?
全局 ? ? ? ? ? ?縮小 ? ? ? ? ? ?Ctrl+- ?
? ?
窗口 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
全局 ? ? ? ? ? ?激活編輯器 ? ? ? ? ? ?F12 ?
全局 ? ? ? ? ? ?切換編輯器 ? ? ? ? ? ?Ctrl+Shift+W ?
全局 ? ? ? ? ? ?上一個編輯器 ? ? ? ? ? ?Ctrl+Shift+F6 ?
全局 ? ? ? ? ? ?上一個視圖 ? ? ? ? ? ?Ctrl+Shift+F7 ?
全局 ? ? ? ? ? ?上一個透視圖 ? ? ? ? ? ?Ctrl+Shift+F8 ?
全局 ? ? ? ? ? ?下一個編輯器 ? ? ? ? ? ?Ctrl+F6 ?
全局 ? ? ? ? ? ?下一個視圖 ? ? ? ? ? ?Ctrl+F7 ?
全局 ? ? ? ? ? ?下一個透視圖 ? ? ? ? ? ?Ctrl+F8 ?
文本編輯器 ? ? ? ? ? ?顯示標(biāo)尺上下文菜單 ? ? ? ? ? ?Ctrl+W ?
全局 ? ? ? ? ? ?顯示視圖菜單 ? ? ? ? ? ?Ctrl+F10 ?
全局 ? ? ? ? ? ?顯示系統(tǒng)菜單 ? ? ? ? ? ?Alt+- ?
? ?
導(dǎo)航 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
Java編輯器 ? ? ? ? ? ?打開結(jié)構(gòu) ? ? ? ? ? ?Ctrl+F3 ?
全局 ? ? ? ? ? ?打開類型 ? ? ? ? ? ?Ctrl+Shift+T ?
全局 ? ? ? ? ? ?打開類型層次結(jié)構(gòu) ? ? ? ? ? ?F4 ?
全局 ? ? ? ? ? ?打開聲明 ? ? ? ? ? ?F3 ?
全局 ? ? ? ? ? ?打開外部javadoc ? ? ? ? ? ?Shift+F2 ?
全局 ? ? ? ? ? ?打開資源 ? ? ? ? ? ?Ctrl+Shift+R ?
全局 ? ? ? ? ? ?后退歷史記錄 ? ? ? ? ? ?Alt+← ?
全局 ? ? ? ? ? ?前進(jìn)歷史記錄 ? ? ? ? ? ?Alt+→ ?
全局 ? ? ? ? ? ?上一個 ? ? ? ? ? ?Ctrl+, ?
全局 ? ? ? ? ? ?下一個 ? ? ? ? ? ?Ctrl+. ?
Java編輯器 ? ? ? ? ? ?顯示大綱 ? ? ? ? ? ?Ctrl+O ?
全局 ? ? ? ? ? ?在層次結(jié)構(gòu)中打開類型 ? ? ? ? ? ?Ctrl+Shift+H ?
全局 ? ? ? ? ? ?轉(zhuǎn)至匹配的括號 ? ? ? ? ? ?Ctrl+Shift+P ?
全局 ? ? ? ? ? ?轉(zhuǎn)至上一個編輯位置 ? ? ? ? ? ?Ctrl+Q ?
Java編輯器 ? ? ? ? ? ?轉(zhuǎn)至上一個成員 ? ? ? ? ? ?Ctrl+Shift+↑ ?
Java編輯器 ? ? ? ? ? ?轉(zhuǎn)至下一個成員 ? ? ? ? ? ?Ctrl+Shift+↓ ?
文本編輯器 ? ? ? ? ? ?轉(zhuǎn)至行 ? ? ? ? ? ?Ctrl+L ?
? ?
搜索 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
全局 ? ? ? ? ? ?出現(xiàn)在文件中 ? ? ? ? ? ?Ctrl+Shift+U ?
全局 ? ? ? ? ? ?打開搜索對話框 ? ? ? ? ? ?Ctrl+H ?
全局 ? ? ? ? ? ?工作區(qū)中的聲明 ? ? ? ? ? ?Ctrl+G ?
全局 ? ? ? ? ? ?工作區(qū)中的引用 ? ? ? ? ? ?Ctrl+Shift+G ?
? ?
文本編輯 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
文本編輯器 ? ? ? ? ? ?改寫切換 ? ? ? ? ? ?Insert ?
文本編輯器 ? ? ? ? ? ?上滾行 ? ? ? ? ? ?Ctrl+↑ ?
文本編輯器 ? ? ? ? ? ?下滾行 ? ? ? ? ? ?Ctrl+↓ ?
? ?
文件 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
全局 ? ? ? ? ? ?保存 ? ? ? ? ? ?Ctrl+X ? ?
Ctrl+S ?
全局 ? ? ? ? ? ?打印 ? ? ? ? ? ?Ctrl+P ?
全局 ? ? ? ? ? ?關(guān)閉 ? ? ? ? ? ?Ctrl+F4 ?
全局 ? ? ? ? ? ?全部保存 ? ? ? ? ? ?Ctrl+Shift+S ?
全局 ? ? ? ? ? ?全部關(guān)閉 ? ? ? ? ? ?Ctrl+Shift+F4 ?
全局 ? ? ? ? ? ?屬性 ? ? ? ? ? ?Alt+Enter ?
全局 ? ? ? ? ? ?新建 ? ? ? ? ? ?Ctrl+N ?
? ?
項(xiàng)目 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
全局 ? ? ? ? ? ?全部構(gòu)建 ? ? ? ? ? ?Ctrl+B ?
? ?
源代碼 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
Java編輯器 ? ? ? ? ? ?格式化 ? ? ? ? ? ?Ctrl+Shift+F ?
Java編輯器 ? ? ? ? ? ?取消注釋 ? ? ? ? ? ?Ctrl+ ?
Java編輯器 ? ? ? ? ? ?注釋 ? ? ? ? ? ?Ctrl+/ ?
Java編輯器 ? ? ? ? ? ?添加導(dǎo)入 ? ? ? ? ? ?Ctrl+Shift+M ?
Java編輯器 ? ? ? ? ? ?組織導(dǎo)入 ? ? ? ? ? ?Ctrl+Shift+O ?
Java編輯器 ? ? ? ? ? ?使用try/catch塊來包圍 ? ? ? ? ? ?未設(shè)置,太常用了,所以在這里列出,建議自己設(shè)置。 ?
也可以使用Ctrl+1自動修正。 ?
? ?
運(yùn)行 ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
全局 ? ? ? ? ? ?單步返回 ? ? ? ? ? ?F7 ?
全局 ? ? ? ? ? ?單步跳過 ? ? ? ? ? ?F6 ?
全局 ? ? ? ? ? ?單步跳入 ? ? ? ? ? ?F5 ?
全局 ? ? ? ? ? ?單步跳入選擇 ? ? ? ? ? ?Ctrl+F5 ?
全局 ? ? ? ? ? ?調(diào)試上次啟動 ? ? ? ? ? ?F11 ?
全局 ? ? ? ? ? ?繼續(xù) ? ? ? ? ? ?F8 ?
全局 ? ? ? ? ? ?使用過濾器單步執(zhí)行 ? ? ? ? ? ?Shift+F5 ?
全局 ? ? ? ? ? ?添加/去除斷點(diǎn) ? ? ? ? ? ?Ctrl+Shift+B ?
全局 ? ? ? ? ? ?顯示 ? ? ? ? ? ?Ctrl+D ?
全局 ? ? ? ? ? ?運(yùn)行上次啟動 ? ? ? ? ? ?Ctrl+F11 ?
全局 ? ? ? ? ? ?運(yùn)行至行 ? ? ? ? ? ?Ctrl+R ?
全局 ? ? ? ? ? ?執(zhí)行 ? ? ? ? ? ?Ctrl+U ?
? ?
重構(gòu) ?
作用域 ? ? ? ? ? ?功能 ? ? ? ? ? ?快捷鍵 ?
全局 ? ? ? ? ? ?撤銷重構(gòu) ? ? ? ? ? ?Alt+Shift+Z ?
全局 ? ? ? ? ? ?抽取方法 ? ? ? ? ? ?Alt+Shift+M ?
全局 ? ? ? ? ? ?抽取局部變量 ? ? ? ? ? ?Alt+Shift+L ?
全局 ? ? ? ? ? ?內(nèi)聯(lián) ? ? ? ? ? ?Alt+Shift+I ?
全局 ? ? ? ? ? ?移動 ? ? ? ? ? ?Alt+Shift+V ?
全局 ? ? ? ? ? ?重命名 ? ? ? ? ? ?Alt+Shift+R ?
全局 ? ? ? ? ? ?重做 ? ? ? ? ? ?Alt+Shift+Y ?
?
================================================================================================================
轉(zhuǎn)自?http://mogoweb.net/archives/335
打造稱手的開發(fā)工具-Eclipse篇
古人云,工欲善其事,必先利其器,孫悟空為了找到稱手的兵器,苦苦尋覓,終于尋得定海神針一枚,打造出如意金箍棒,但有多少程序員能夠靜心專研手頭的工具呢?從事軟件開發(fā)多年,接觸了各種各樣的軟件開發(fā)工具,遠(yuǎn)的不說,代碼編輯工具就接觸過不少,Turbo C/Visual Studio/C++ Builder/Source Insight/UltraEdit/Vim等,但都沒有精通,更別說按照自己的喜好增加一些腳本/插件。轉(zhuǎn)入Android開發(fā)后,又開始接觸Eclipse,發(fā)現(xiàn)Eclipse真是個好東西。但要讓自己運(yùn)用的得心應(yīng)手,還需要專研一些設(shè)置。本文就是記錄一下我在開發(fā)過程中的一些Eclipse設(shè)置。
1. 過濾某些文件/文件夾
閱讀android源碼(C++)及chromium源碼時,選擇新建工程的選項(xiàng): Makefile Project with Existing Code。眾所周知,android和chromium的源碼超級大,Eclipse打開這些大工程,在Refresh Workspace和Indexer時非常慢,而且極占CPU。通常情況下,我們可能只對其中的部分文件感興趣,有必要進(jìn)行一下過濾。Eclipse提供了Include Filter和Exclude Filter,顧名思義,Include Filter就是只包含滿足條件的文件/文件夾,Exclude Filter則是排除滿足條件的文件/文件夾。可以定義多個Filter。方法如下:
在Project Explorer中,選定某個目錄,點(diǎn)擊右鍵,選擇Properties,找到Resource Filters,點(diǎn)擊Add…:
可以選擇按Name/Project Relative Path/Location/Last Modified/File Length等等進(jìn)行匹配,我一般使用Project Relative Path進(jìn)行匹配。
2. 導(dǎo)入google c++編程風(fēng)格
chromium C++代碼采用的是google c++ code style。google c++編碼規(guī)范被李開復(fù)稱為最好的C++編程規(guī)范,有趣的可以到這里看看,條目非常多。
Eclipse也非常強(qiáng)大,可以支持不同的code style,而且這些style可以自定義,還可以導(dǎo)入/導(dǎo)出(需要注意的是,Eclipse的code style主要針對代碼縮進(jìn)/空格/括號位置,并不涉及變量命名等等)。google也提供了針對Eclipse的xml配置文件,我們只需導(dǎo)入到Eclipse即可,省去繁瑣的配置。下面就說說導(dǎo)入方法。
- 從http://google-styleguide.googlecode.com/svn/trunk/下載eclipse-cpp-google-style.xml
- 打開Eclipse,選擇Window?|?Preferences?菜單。
- 在彈出對話框左邊中選擇C/C++?|?Code Style。然后點(diǎn)擊后側(cè)的Import…按鈕
- 選擇所下載的eclipse-cpp-google-style.xml文件,可以看到Select a profile下面的下拉框中多了Google C++選項(xiàng)。
- 點(diǎn)擊Apply按鈕
3. 常用快捷鍵
| CTRL+TAB | 頭文件和c/c++文件之間切換 |
| CTRL+SHIFT+R | 對話框中輸入文件名(有聯(lián)想功能),快速打開文件 |
| CTRL+SHIFT+R | 對話框中輸入文件名(有聯(lián)想功能),快速打開文件 |
| CTRL+o | 輸入方法(函數(shù))名,可快速定位到方法(函數(shù)) |
| CTRL+l | 輸入行號,快速定位到指定行 |
| CTRL+h | 打開文件搜索對話框 |
================================================================================================================================
eclipse+cdt+gcc編譯選項(xiàng)控制
轉(zhuǎn)自?http://hi.baidu.com/sfzhaoif/item/32ecf6bfe055b542bb0e1209
? ? ? ? 如果我們的程序調(diào)用動態(tài)鏈接庫,當(dāng)在cdt中運(yùn)行的時候,可以通過run-->enviroment-->添加LD_LIBRARY_PATH 環(huán)境變量來設(shè)置查找動態(tài)鏈接庫文件的路徑。但是在運(yùn)行的時候,程序去那里找動態(tài)鏈接庫呢?
? ? ? ? 方法主要有兩種。一種,是設(shè)置系統(tǒng)的LD_LIBRARY_PATH 環(huán)境變量(在eclipse里設(shè)置對外部正式運(yùn)行的程序無效)。設(shè)置的方法見附錄資料三
? ? ? ? 另外一種,是將動態(tài)鏈接庫文件的路徑編譯進(jìn)二進(jìn)制可執(zhí)行文件。那么在eclipse如何進(jìn)行編譯呢?如下圖
? ? ? 好了,這下我們的程序就可以脫離eclipse運(yùn)行了(,找了好久啊)。注意,不要設(shè)置錯誤了,是g++linker的miscellaneous。
? ? ? 第二種方法的缺點(diǎn)是,庫的地址就不能變動了(在游戲等應(yīng)用程序中用這種方法教好)。第一種方法的優(yōu)點(diǎn)是通過更改LD_LIBRARY_PATH的值,可以變動庫文件的地址。它的缺點(diǎn)當(dāng)然就是還要改動環(huán)境變量的值了。
---------------------------------------------------------可愛的分割線----------------------------------------------------------
(一)linux 動態(tài)庫(http://linux.chinaunix.net/bbs/archiver/?tid-974839.html)
1. Linux下動態(tài)庫使用小結(jié)
. 靜態(tài)庫和動態(tài)庫的基本概念
靜 態(tài)庫,是在可執(zhí)行程序連接時就已經(jīng)加入到執(zhí)行碼中,在物理上成為執(zhí)行程序的一部分;使用靜態(tài)庫編譯的程序運(yùn)行時無需該庫文件支持,哪里都可以用,但是生成的可執(zhí)行文件較大。動態(tài)庫,是在可執(zhí)行程序啟動時加載到執(zhí)行程序中,可以被多個可執(zhí)行程序共享使用。使用動態(tài)庫編譯生成的程序相對較小,但運(yùn)行時需要庫文 件支持,如果機(jī)器里沒有這些庫文件就不能運(yùn)行。
2.?如何使用動態(tài)庫
如何程序在連接時使用了共享庫,就必須在運(yùn)行的時候能夠找到共享庫的位置。linux的可執(zhí)行程序在執(zhí)行的時候默認(rèn)是先搜索/lib和/usr/lib這兩個目錄,然后按照 /etc/ld.so.conf里面的配置搜索絕對路徑。同時,Linux也提供了環(huán)境變量LD_LIBRARY_PATH供用戶選擇使用,用戶可以通過 設(shè)定它來查找除默認(rèn)路徑之外的其他路徑,如查找/work/lib路徑,你可以在/etc/rc.d/rc.local或其他系統(tǒng)啟動后即可執(zhí)行到的腳本添加如下語句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路徑優(yōu)先于系統(tǒng)默認(rèn)路徑之前查找(詳細(xì)參考《使用LD_LIBRARY_PATH》)。
不過LD_LIBRARY_PATH的設(shè)定作用是全局的,過多的使用可能會影響到其他應(yīng)用程序的運(yùn) 行,所以多用在調(diào)試。(LD_LIBRARY_PATH的缺陷和使用準(zhǔn)則,可以參考《Why
LD_LIBRARY_PATH is bad》 )。通常情況下推薦還是使用gcc的-R或-rpath選項(xiàng)來在編譯時就指定庫的查找路徑,并且該庫的路徑信息保存在可執(zhí)行文件中,運(yùn)行時它會直接到該路徑查找?guī)?#xff0c;避免了使用LD_LIBRARY_PATH環(huán)境變量查找。
3.庫的鏈接時路徑和運(yùn)行時路徑
現(xiàn)代連 接器在處理動態(tài)庫時將鏈接時路徑(Link-time path)和運(yùn)行時路徑(Run-time path)分開,用戶可以通過-L指定連接時庫的路徑,通過-R(或-rpath)指定程序運(yùn)行時庫的路徑,大大提高了庫應(yīng)用的靈活性。比如我們做嵌入式移植時#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/-llibz-1.2.3 (work/lib/zlib下是交叉編譯好的zlib庫),將target編譯好后我們只要把zlib庫拷貝到開發(fā)板的系統(tǒng)默認(rèn)路徑下即可。或者通過- rpath(或-R )、LD_LIBRARY_PATH指定查找路徑。 ?
(二)如何使Linux啟動之后就加載LD_LIBRARY_PATH的路徑 (http://topic.csdn.net/t/20041020/10/3472713.html?)
請問如何使Linux啟動之后就加載LD_LIBRARY_PATH的路徑!
是修改.bash_profile文件嗎,我修改了但是啟動Linux之后LD_LIBRARY_PATH的路徑還是沒有,運(yùn)行程序時有些庫文件加載不上!
1 樓winux0(隨緣不變)
? ? ?記住最后要export LD_LIBRARY_PATHTop
樓bekars(渦輪增壓:沒有解決不了的問題,因?yàn)楦揪蜎]有問題)
? ? ?.bash_profile?
還是不行Top
?3 樓cheeralen(嵌入式)
? ? ? ?bash不會從profile文件里讀取環(huán)境變量的?
? ? ? ?csh才會從profile文件里讀取變量?
? ? ? ?所以你可以修改你的bash為csh!!!Top
4 樓bekars(渦輪增壓:沒有解決不了的問題,因?yàn)楦揪蜎]有問題)
? ? ? ?樓上的不太明白,能不能說多一些Top
5 樓winux0(隨緣不變)
? ? ?應(yīng)該不會吧,不然你的export的那些PATH也沒有用哦Top
6 樓bekars(渦輪增壓:沒有解決不了的問題,因?yàn)楦揪蜎]有問題)回復(fù)于 2004-10-20 12:35:29 得分 0
? ? ?不知道,你可以幫我試試嗎?我這里就是不行?
(三)使用LD_LIBRARY_PATH(? http://blog.chinaunix.net/u1/48140/showart_377250.html)
環(huán)境變量LD_LIBRARY_PATH用來指定查找共享庫時除了默認(rèn)路徑之外的其他路徑。(該路徑在默認(rèn)路徑之前查找)
移植程序時的經(jīng)常碰到需要使用一些特定的動態(tài)庫,而這些編譯好的動態(tài)庫放在我們自己建立的目錄里,這時我們可以設(shè)置LD_LIBRARY_PATH。
? ? 例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/lib/
這樣就可以使用/work/lib/下的庫文件了,運(yùn)行程序后系統(tǒng)會自動到環(huán)境變量LD_LIBRARY_PATH指定的路徑中查找其所需的庫。
系統(tǒng)查找動態(tài)庫的順序
系統(tǒng)先找LD_LIBRARY_PATH下的庫再找/lib and /usr/lib等路徑下的庫,還有/etc/ld.so.conf里指定的路徑(如果ld.so.conf存在),man ldconfig for more information
使Linux啟動之后就加載LD_LIBRARY_PATH的路徑
/etc/rc.d/rc.local文件中加入export LD_LIBRARY_PATH="xxxxx" ?即可.
如果在鏈接時使用了"-R"和"-L"選項(xiàng),則相關(guān)動態(tài)庫的路徑將保存在ELF文件中,于是以后的運(yùn)行中不再需要設(shè)置環(huán)境變量去定位動態(tài)庫。比如,有一個?/usr/local/lib/libfoo.so,而你的bar程序需要這個libfoo.so,編譯、鏈接時最好?這樣 :gcc -Wall -pipe -O3 -o bar -R/usr/local/lib -L/usr/local/lib bar.c -lfoo
(#man gcc ,沒發(fā)現(xiàn)-R或-rpath選項(xiàng),待查)
===============================================================================================================
轉(zhuǎn)自?http://hi.baidu.com/open_hard/item/8dd295db64d6c0ea54347f1b
Linux動態(tài)庫(.so)搜索路徑
眾所周知,Linux動態(tài)庫的默認(rèn)搜索路徑是/lib和/usr/lib。動態(tài)庫被創(chuàng)建后,一般都復(fù)制到這兩個目錄中。當(dāng)程序執(zhí)行時需要某動態(tài)庫, 并且該動態(tài)庫還未加載到內(nèi)存中,則系統(tǒng)會自動到這兩個默認(rèn)搜索路徑中去查找相應(yīng)的動態(tài)庫文件,然后加載該文件到內(nèi)存中,這樣程序就可以使用該動態(tài)庫中的函 數(shù),以及該動態(tài)庫的其它資源了。在Linux 中,動態(tài)庫的搜索路徑除了默認(rèn)的搜索路徑外,還可以通過以下三種方法來指定。
方法一:在配置文件/etc/ld.so.conf中指定動態(tài)庫搜索路徑。
可以通過編輯配置文件/etc/ld.so.conf來指定動態(tài)庫的搜索路徑,該文件中每行為一個動態(tài)庫搜索路徑。每次編輯完該文件后,都必須運(yùn)行命令ldconfig使修改后的配置生效。我們通過例1來說明該方法。
例1:
我們通過以下命令用源程序pos_conf.c(見程序1)來創(chuàng)建動態(tài)庫 libpos.so,詳細(xì)創(chuàng)建過程請參考文[1]。
# gcc -c pos_conf.c
???????? # gcc -shared -fPCI -o libpos.so pos_conf.o
???????? #
#include <stdio.h>
???????? void pos()
???????? {
???????????????? printf("/root/test/conf/lib\n");
????????? }
????????? 程序1: pos_conf.c
接著通過以下命令編譯main.c(見程序2)生成目標(biāo)程序pos。
# gcc -o pos main.c -L. -lpos
????????? #
void pos();
??????? int main()
??????? {
???????????? pos();
????????????? return 0;
???????? }
??????? 程序2: main.c
然后把庫文件移動到目錄/root/test/conf/lib中。
# mkdir -p /root/test/conf/lib
???????? # mv libpos.so /root/test/conf/lib
????????? #
最后編輯配置文件/etc/ld.so.conf,在該文件中追加一行"/root/test/conf/lib"。
運(yùn)行程序pos試試。
# ./pos
???????? ./pos: error while loading shared libraries: libpos.so: cannot open shared object file: No such file or directory
????????? #
出錯了,系統(tǒng)未找到動態(tài)庫libpos.so。找找原因,原來在編輯完配置文件/etc/ld.so.conf后,沒有運(yùn)行命令ldconfig,所以剛才的修改還未生效。我們運(yùn)行l(wèi)dconfig后再試試。
# ldconfig
???????? # ./pos
????????? /root/test/conf/lib?
?????????? #
程序pos運(yùn)行成功,并且打印出正確結(jié)果。
方法二:通過環(huán)境變量LD_LIBRARY_PATH指定動態(tài)庫搜索路徑。
通過設(shè)定環(huán)境變量LD_LIBRARY_PATH也可以指定動態(tài)庫搜索路徑。當(dāng)通過該環(huán)境變量指定多個動態(tài)庫搜索路徑時,路徑之間用冒號":"分隔。下面通過例2來說明本方法。
例2:
我們通過以下命令用源程序pos_env.c(見程序3)來創(chuàng)建動態(tài)庫libpos.so。
# gcc -c pos_env.c
???????? # gcc -shared -fPCI -o libpos.so pos_env.o
????????? #
#include <stdio.h>
??????? void pos()
???????? {
?????????????? printf("/root/test/env/lib\n");
????????? }
??????? 程序3: pos_env.c
測試用的可執(zhí)行文件pos可以使用例1中的得到的目標(biāo)程序pos,不需要再次編譯。因?yàn)閜os_conf.c中的函數(shù)pos和pos_env.c中的函數(shù)pos 函數(shù)原型一致,且動態(tài)庫名相同,這就好比修改動態(tài)庫pos后重新創(chuàng)建該庫一樣。這也是使用動態(tài)庫的優(yōu)點(diǎn)之一。
然后把動態(tài)庫libpos.so移動到目錄/root/test/conf/lib中。
# mkdir -p /root/test/env/lib
???????? # mv libpos.so /root/test/env/lib
????????? #
我們可以使用export來設(shè)置該環(huán)境變量,在設(shè)置該環(huán)境變量后所有的命令中,該環(huán)境變量都有效。
例如:
# export LD_LIBRARY_PATH=/root/test/env/lib
????? ?? #
但本文為了舉例方便,使用另一種設(shè)置環(huán)境變量的方法,既在命令前加環(huán)境變量設(shè)置,該環(huán)境變量只對該命令有效,當(dāng)該命令執(zhí)行完成后,該環(huán)境變量就無效了。如下述命令:
# LD_LIBRARY_PATH=/root/test/env/lib ./pos
??????? /root/test/env/lib
???????? #
程序pos運(yùn)行成功,并且打印的結(jié)果是"/root/test/env/lib",正是程序pos_env.c中的函數(shù)pos的運(yùn)行結(jié)果。因此程序pos搜索到的動態(tài)庫是/root/test/env/lib/libpos.so。
方法三:在編譯目標(biāo)代碼時指定該程序的動態(tài)庫搜索路徑。
還可以在編譯目標(biāo)代碼時指定程序的動態(tài)庫搜索路徑。這是通過gcc 的參數(shù)"-Wl,-rpath,"指定(如例3所示)。當(dāng)指定多個動態(tài)庫搜索路徑時,路徑之間用冒號":"分隔。
例3:
我們通過以下命令用源程序pos.c(見程序4)來創(chuàng)建動態(tài)庫libpos.so。
# gcc -c pos.c
???????? # gcc -shared -fPCI -o libpos.so pos.o
????????? #
#include <stdio.h>
??????? void pos()
???????? {
?????????????? printf("./\n");
???????? }
???????? 程序4: pos.c
因?yàn)槲覀冃枰诰幾g目標(biāo)代碼時指定可執(zhí)行文件的動態(tài)庫搜索路徑,所以需要用gcc命令重新編譯源程序main.c(見程序2)來生成可執(zhí)行文件pos。
# gcc -o pos main.c -L. -lpos -Wl,-rpath,./
???????? #
再運(yùn)行程序pos試試。
# ./pos
???????? ./
????????? #
程序pos運(yùn)行成功,輸出的結(jié)果正是pos.c中的函數(shù)pos的運(yùn)行結(jié)果。因此程序pos搜索到的動態(tài)庫是./libpos.so。
以上介紹了三種指定動態(tài)庫搜索路徑的方法,加上默認(rèn)的動態(tài)庫搜索路徑/lib和/usr/lib,共五種動態(tài)庫的搜索路徑,那么它們搜索的先后順序是什么呢?
在介紹上述三種方法時,分別創(chuàng)建了動態(tài)庫./libpos.so、 /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so。我們再用源程序 pos_lib.c(見程序5)來創(chuàng)建動態(tài)庫/lib/libpos.so,用源程序pos_usrlib.c(見程序6)來創(chuàng)建動態(tài)庫 /usr/lib/libpos.so。
#include <stdio.h>
???????? void pos()
????????? {
???????????????? printf("/lib\n");
?????????? }
????????? 程序5: pos_lib.c
#include <stdio.h>
??????? void pos()
???????? {
??????????????? printf("/usr/lib\n");
???????? }
??????? 程序6: pos_usrlib.c
這樣我們得到五個動態(tài)庫libpos.so,這些動態(tài)庫的名字相同,且都包含相同函數(shù)原型 的公用函數(shù)pos。但存儲的位置不同和公用函數(shù)pos 打印的結(jié)果不同。每個動態(tài)庫中的公用函數(shù)pos都輸出該動態(tài)庫所存放的位置。這樣我們可以通過執(zhí)行例3中的可執(zhí)行文件pos得到的結(jié)果不同獲知其搜索到了 哪個動態(tài)庫,從而獲得第1個動態(tài)庫搜索順序,然后刪除該動態(tài)庫,再執(zhí)行程序pos,獲得第2個動態(tài)庫搜索路徑,再刪除第2個被搜索到的動態(tài)庫,如此往復(fù), 將可得到Linux搜索動態(tài)庫的先后順序。程序pos執(zhí)行的輸出結(jié)果和搜索到的動態(tài)庫的對應(yīng)關(guān)系如表1所示:
創(chuàng)建各個動態(tài)庫,并放置在相應(yīng)的目錄中。測試環(huán)境就準(zhǔn)備好了。執(zhí)行程序pos,并在該命令行中設(shè)置環(huán)境變量LD_LIBRARY_PATH。
# LD_LIBRARY_PATH=/root/test/env/lib ./pos
????????? ./
????????? #
根據(jù)程序pos的輸出結(jié)果可知,最先搜索的是編譯目標(biāo)代碼時指定的動態(tài)庫搜索路徑。然后我們把動態(tài)庫./libpos.so刪除了,再運(yùn)行上述命令試試。
# rm libpos.so
??????? rm: remove regular file `libpos.so'? y
??????? # LD_LIBRARY_PATH=/root/test/env/lib ./pos
??????? /root/test/env/lib
??????? #
根據(jù)程序pos的輸出結(jié)果可知,第2個動態(tài)庫搜索的路徑是環(huán)境變量LD_LIBRARY_PATH指定的。我們再把/root/test/env/lib/libpos.so刪除,運(yùn)行上述命令。
# rm /root/test/env/lib/libpos.so
???????? rm: remove regular file `/root/test/env/lib/libpos.so'? y
??????? # LD_LIBRARY_PATH=/root/test/env/lib ./pos
??????? /root/test/conf/lib
??????? #
第3個動態(tài)庫的搜索路徑是配置文件/etc/ld.so.conf指定的路徑。刪除動態(tài)庫/root/test/conf/lib/libpos.so后再運(yùn)行上述命令。
# rm /root/test/conf/lib/libpos.so
??????? rm: remove regular file `/root/test/conf/lib/libpos.so'? y
??????? # LD_LIBRARY_PATH=/root/test/env/lib ./pos
??????? /lib
??????? #
第4個動態(tài)庫的搜索路徑是默認(rèn)搜索路徑/lib。我們再刪除動態(tài)庫/lib/libpos.so,運(yùn)行上述命令。
# rm /lib/libpos.so
??????? rm: remove regular file `/lib/libpos.so'? y
??????? # LD_LIBRARY_PATH=/root/test/env/lib ./pos
??????? /usr/lib
??????? #
最后的動態(tài)庫搜索路徑是默認(rèn)搜索路徑/usr/lib。
綜合以上結(jié)果可知,動態(tài)庫的搜索路徑搜索的先后順序是:
1.編譯目標(biāo)代碼時指定的動態(tài)庫搜索路徑;
2.環(huán)境變量LD_LIBRARY_PATH指定的動態(tài)庫搜索路徑;
3.配置文件/etc/ld.so.conf中指定的動態(tài)庫搜索路徑;
4.默認(rèn)的動態(tài)庫搜索路徑/lib;
5.默認(rèn)的動態(tài)庫搜索路徑/usr/lib。
在上述1、2、3指定動態(tài)庫搜索路徑時,都可指定多個動態(tài)庫搜索路徑,其搜索的先后順序是按指定路徑的先后順序搜索的。對此本文不再舉例說明,有興趣的讀者可以參照本文的方法驗(yàn)證。
總結(jié)
以上是生活随笔為你收集整理的问题合集 ------- 用 Eclipse 平台进行 C/C++ 开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c文件操作
- 下一篇: Java和C/C++程序实时通讯数据移植