轉:NetBeans的遠程Linux C開發實踐

來源:互聯網
上載者:User

標籤:

轉: http://blog.csdn.net/jacktan/article/details/9268535

 

一直以來總覺得NetBeans生活在Eclipse的陰影下,同樣做為一款不錯的基於Java開發的IDE卻走著完全不同的發展道路。可能是由於之前我一直較多的使用Java的緣故,所以Eclipse一直是我最為常用的工具。偶爾我也會嘗鮮一下NetBeans,但是總覺得使用習慣上有點彆扭。不過由於工作的需要,開始更多的接觸Linux C,Eclipse CDT就顯得越來越蒼白。畢竟Cygwin和真正的Linux還是有很大差異的,寫一個簡單的C程式Cygwin可以應付,但是對於一個較大的C程式且需要非常複雜的環境時,Cygwin就明顯的力不從心了。於是乎就開始尋找其他的解決方案......。

在網上搜尋了相關的技術類文章,說實話,90%的文章內容相仿,或是抄來抄去,或是淺嘗即止。大部分內容均來自官網手冊,而使用的例子也是“Hello World”型的,毫無實用價值。做為一名“騎單車”的架構師,有責任寫一篇系統的,圖文並茂的總結性文章,給所有有類似需要的同學提供一個有價值的參考。

閑話少說,先來介紹一下我們的環境和此次示範的常式:

環境:

本機環境為windows7,NetBeans7.3.1,Java1.6(NetBeans運行需要Java環境)。

遠程主機為RHEL5.8 64位,SSH,Oracle資料庫11.2.0,Oracle用戶端11.2.0,GCC4.1.2,安裝了所有C/C++開發包,編譯安裝ocilib3.12.1。

示範常式:

本次我們示範的常式是開發一個訪問Oracle資料庫的C程式,它需要訪問一個第三方的函數庫(ocilib),並且依賴Oracle用戶端。

之所以採用這個常式主要出於如下幾個目的:

1. 瞭解C訪問Oracle資料庫的其他方式(之前我們一般都使用PRO*C的方式);

2. 瞭解如何在遠程模式下compile原始碼;

3. 瞭解如何在遠程模式下linked第三方函數庫;

4. 瞭解如何在遠程模式下進行Debug;

以上幾個知識點基本上涵蓋了日常開發中所需掌握的大部分技能(我指的僅限於開發工具的使用技能,至於編程技能因人而異了)。

一. 配置NetBeans遠程開發環境

這部分確實很乏味,因為官網上已經有很詳細的介紹了(中英文版都有),且網上也有一群人在不停的複製拷貝把自己當成複印機,所以我實在沒必要再拷貝一遍。這裡我提供一個連結:https://netbeans.org/kb/docs/cnd/remotedev-tutorial_zh_CN.html,如果不知道如何配置的同學可以先去瞭解一下。

最後提供一下我自己本機上的配置結果,可做為一個參照系:

這裡在嘮叨幾句,同學們可能看到那個表徵圖是紅色的,和上面的"localhost"的表徵圖不一樣,這是因為這個遠程主機尚未串連,你可以通過在這個主機上單擊右鍵,並選擇“串連”命令來串連遠程主機,如果串連成功表徵圖就會變成綠色了。另外這裡還會列出我遠程主機上的工具鏈,有gcc, g++,make和gdb等,有了這些工具我們才能進行遠程開發和調試。

NetBeans還提供了問題跟蹤器(JIRA)和Hudson構建器服務,這 2個服務對我們日常的開發也大有協助,至少我在Eclipse上沒有發現這些有用的工具(可能是我孤陋寡聞)。

二. 準備遠程主機開發環境

遠程主機上需要安裝Oracle資料庫,當然還有Oracle資料庫用戶端(需要oci.h標頭檔和libclntsh.so動態庫以及TNS的配置),這些環境的安裝和配置如果要寫又是上W字,估計寫了你也不會去看,所以如果您對此還不甚瞭解,那就去google一下吧,相關的文章多的是(判斷一個Oracle用戶端是否安裝成功,只要執行一下sqlplus命令並且可以串連Oracle資料庫且可執行select語句即可)。

我這裡想介紹一下ocilib函數庫的編譯安裝。這個函數庫是對OCI的一個封裝,提供了非常友好的API介面,如果你熟悉JDBC,那你會覺得它很親切。從http://sourceforge.net/projects/orclib上下載最新的版本,並解壓縮到遠程主機上。網上有些文章寫的有點問題,編譯參數不太一樣,我的編譯參數如下:

 

[plain] view plain copy 
  1. ./configure --prefix=/usr/local/ocilib --with-oracle-lib-path=/u01/app/oracle/product/11.2.0/db_1/lib --with-oracle-headers-path=/u01/app/oracle/product/11.2.0/db_1/rdbms/public  
  2. make && make install  


我是將其安裝在/usr/local/ocilib目錄中,並且一定要指定oracle的lib目錄和標頭檔所在的目錄,否則編譯不通過。

 

當編譯完成之後,會產生ocilib的標頭檔和相關的連結庫,如下所示:

標頭檔目錄及標頭檔。

動態庫和靜態庫檔案。

至此,我們的第三方函數庫編譯安裝完成,接下去可以在本機上開發原始碼了。

三. 在本機上編寫原始碼

最讓人興奮的環節到來了,終於可以寫代碼了。在NetBeans中建立一項目,選擇項目類別為“C/C++應用程式”,然後點擊下一步,如所示:

在第二個對話方塊中輸入項目名稱,項目位置,構建主機等資訊,如所示:

最新點擊完成,建立項目完成。如所示:

我們開啟main.c檔案,開始編寫代碼,如下所示:

 

[cpp] view plain copy 
  1. /*  
  2.  * File:   main.c 
  3.  * Author: Administrator 
  4.  * 
  5.  * Created on 2013年7月5日, 下午5:32 
  6.  */  
  7.   
  8. #include <stdio.h>  
  9. #include <stdlib.h>  
  10. #include <ocilib.h>  
  11.   
  12. /* 
  13.  *  
  14.  */  
  15. int main(int argc, char** argv) {  
  16.     OCI_Connection *cn;  
  17.     OCI_Statement *st;  
  18.     OCI_Resultset *rs;  
  19.   
  20.     //init instance  
  21.     if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT | OCI_ENV_CONTEXT)) {  
  22.         printf("OCI_Initialize failure!\n");  
  23.         return EXIT_FAILURE;  
  24.     }  
  25.   
  26.     cn = OCI_ConnectionCreate("STOREVM", "username", "password",  
  27.             OCI_SESSION_DEFAULT);  
  28.     if (!cn) {  
  29.         printf("OCI_ConnectionCreate failure!\n");  
  30.         return EXIT_FAILURE;  
  31.     }  
  32.   
  33.     st = OCI_StatementCreate(cn);  
  34.     if (!st) {  
  35.         printf("OCI_StatementCreate failure!\n");  
  36.         return EXIT_FAILURE;  
  37.     }  
  38.   
  39.     OCI_ExecuteStmt(st, "select * from test t");  
  40.   
  41.     rs = OCI_GetResultset(st);  
  42.   
  43.     while (OCI_FetchNext(rs))  
  44.         printf("table.name: %s, PK.name %s\n", OCI_GetString(rs, 1),  
  45.             OCI_GetString(rs, 2));  
  46.   
  47.     printf("\n%d row(s) fetched\n", OCI_GetRowCount(rs));  
  48.   
  49.     OCI_Cleanup();  
  50.   
  51.     return EXIT_SUCCESS;  
  52. }  

可能IDE會提示找不到ocilib.h檔案,因為沒有把ocilib的include路徑包含進來。我們可以點擊“工具”菜單並選擇“選項”功能表項目,在彈出的對話方塊中選擇“C/C++”選項卡,如所示:

 

在“代碼協助”選項卡中,首先在“工具集合”下拉框中選擇我們定義的遠程主機,然後再“C 編譯器”選項卡中點擊“添加”按鈕,這時會顯示遠程主機的目錄結構,接著選擇ocilib的include路徑,比如我遠程主機上的路徑是“/usr/local/ocilib/inculde”,完成之後點擊確定按鈕。這時就不會再提示找不到ocilib.h標頭檔了。我們也可以通過此方法將其他函數庫的標頭檔引進來(這個方法解決了在本地IDE中引入遠程主機上標頭檔的問題)。

四. 編譯及連結

代碼寫好了,開始編譯代碼,點擊工具列上“構建項目”按鈕,如所示:

悲劇!編譯失敗了,提示找不到ocilib.h檔案。如所示:

之前我們不是已經將ocilib.h標頭檔引入進來嗎?這麼還說沒找到呢?其實這是兩個概念,之前引入的只是代碼協助的功能,此功能提供了我們可以在IDE中瀏覽標頭檔的內容,而現在是在遠程主機上編譯原始碼,說白了,就是我們遺漏了GCC編譯參數。好吧,讓我們繼續。

在項目中點擊右鍵,在操作功能表中選擇“屬性”,會彈出一個項目屬性對話方塊,如所示:

在構建下我們選擇“C編譯器”,然後在 右邊的“包含目錄”項中填寫遠程主機上ocilib的include路徑(如果是多個目錄,每個目錄之間用分號隔開)。最後點擊確定按鈕。當然此處還有其他一些GCC的編譯參數可供選擇,按照自己的實際情況加以選擇即可。這裡建議把“警告層級”替換成“更多警告”或“將警告替換成錯誤”選項。

好了,我們再次點擊工具列上的“構建項目”按鈕。這次編譯總算過了,但是在串連ocilib動態庫的時候報錯了,如所示:

這是明顯的未串連到動態庫的錯誤,好吧,繼續開啟項目屬性對話方塊,如所示:

在構建的下面我們選擇“連結器”,然後在右面的“其他庫目錄”中填寫遠程主機上的ocilib的lib目錄路徑(如果有多個目錄,每個目錄之間用分號隔開)。接著我們在“庫”這項中點擊右邊的按鈕,會彈出一個庫對話方塊,如所示:

由於我們要選擇遠端函數庫,所以只能選擇“添加選項”按鈕,在彈出的對話方塊中,選擇“其他選項”並填寫指定庫的參數,如中所示。通過這種方法,我們就可以解決gcc編譯連結遠程主機上任意函數庫的問題。我們不再需要在本機上安裝gcc的模擬linux環境了,比如:Cygwin等。

完成之後點擊一連串的確定按鈕,再次的點擊工具列上的“構建項目”按鈕,這次編譯連結都成功完成了,如所示:

從中,我們還能發現,遠程主機上同時產生了可執行檔的路徑:/root/.netbeans/remote/www.storevm.org/zgc-20130102uwx-Windows-x86/D/CPRO/ocilib_test。你可以到遠程主機上去檢查一下,看看是否存在這個檔案(至於這是通過什麼工作機制實現的,請參考官網介紹,我這裡就不再贅述了)。

五. 代碼運行與調試

編譯連結都OK了,可以執行程式了,我們先建立一張表,表名為test,表中有2個欄位,都是varchar2類型的,最後在insert一些測試資料。點擊工具列上的“運行項目”按鈕,在IDE的輸出控制台輸出了表中的3行記錄,程式執行成功,如所示:

以下是我們實際表中的記錄(通過PL/SQL):

程式執行的結果和SQL執行的結果完全相同。

至此,所有開發全部完成。接下去我們來玩玩遠程主機的調試,其實NetBeans的遠程主機調試和在本地調試的操作步驟完全一樣。打上斷點,然後點擊“調試項目”按鈕,最後按F6鍵進行單步調試。如所示:

可通過調試工具列上的按鈕進行單步,步入,步出等Debug操作。感覺上和在本地偵錯工具完全一樣。有一點要注意,就是不要在項目路徑中包含中文字元,否則無法啟動遠端偵錯程式。

我想講述的內容就這些了,寫到這裡,突然有些感想,記得十幾年前,在那IDE匱乏的年代,基本上都是靠記事本或是vim等工具來編寫C代碼,然後再FTP到Linux下編譯運行調試。有時為了調試一個很難發現的bug不得不在代碼中加上一大堆的printf函數。或許直至今日你仍然看不起那些用IDE寫代碼的人,或許那些剛入公司的80,90後正在用崇拜的眼光看著你飛速的在記事本上敲入代碼而讓你沾沾自喜,又或許你會用100種理由在論壇上大談徒手代碼的優勢。的確,你很牛逼,我也由衷的崇拜你這種毅力。不過做為技術人員我們應該擁抱變化,接受變化。應該始終的站在技術的前沿陣地。技術人員只能向前看,不能原地看,更不能回頭看,那隻會制約我們的發展。中國人墨守成規是上千年來的積習,但是搞技術的人不能墨守,否則我們永遠都只會模仿,山寨!那些仍然還在記事本上寫代碼人們,希望我的這篇文章或許給你一點微不足道的啟示!

轉:NetBeans的遠程Linux C開發實踐

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.