Dev-Cpp/Mingw32 環境介紹

http://wxjiao.blog.hexun.com/1945078_d.html

 

 

Dev-Cpp/Mingw32 環境介紹 [轉貼 2005-12-30 14:37:51]  

我頂 字號:

文章來源: 點擊查看原文:Dev-Cpp/Mingw32 環境介紹

Dev-Cpp/Mingw32 環境介紹(1)

 

前言


  對於現在越來越多得關於編程方面得問題和商業公司對版權問題的擔心。所以向各位推薦一款類似於VC的IDE。這款IDE所使用的編譯程序是 GCC的Win32版本 Mingw32。而IDE本身也是GPL協議的產物。所以,不論是商業用戶,還是個人用戶都能夠自由的使用她,而不必爲使用盜版軟件而提心吊膽的。另外,由於Mingw32是GCC的Win32版本。所以,也爲Win32的程序員可以瞭解一下Unix和類Unix下的編程感覺。而且,Mingw32對Win32函數的支持也是很不錯的。希望,我們的Mingw32之旅可以帶給你快樂。

介紹


  有關Dev-Cpp的介紹,我在這裏不想多做解釋。因爲下面會具體的介紹和講解的。我在這裏只是想要介紹一下有關GCC的內容。因爲,Dev-Cpp所使用的Mingw32是一款GCC編譯器。所以,對GCC的瞭解有助於使用Dev-Cpp。

gcc.exe
  這是一個C語言的編譯器,負責編譯C語言。這個也許大家都知道。不過,在這裏我要先向大家說明一下。gcc只是一個C語言的編譯器。不能識別C++代碼。所以,以前所說的gcc可以編寫C++是一個誤傳。因爲,我們通常所說的GCC不是gcc.exe而是GCC的一套程序。其中就包括可以編譯C++語言的g++.exe

如果,你不確定這個gcc的版本,可以用如下的命令查看。

gcc -v

關於編譯,gcc可以通過命令符編譯。

gcc source.c -o binary

以上的命令,是讓gcc直接由.c代碼編譯成可執行代碼。
也可以這樣。

gcc -c source.c -o code.o
gcc code.o -o binary

這樣就生成了一組二進制代碼,然後在通過二進制代碼生成可執行程序。

g++.exe
  剛纔已經說過了,這個是一個用於編譯C++代碼的程序。基本用法和gcc一樣。所以這裏不再介紹了。只是讓各位瞭解一下,這個程序是編譯C++代碼的。

gdb.exe
  用於調試程序的。功能非常強大。可以調試C,C++等語言。據說還可以調試Java程序。不過我沒有試過。對於gcc/g++編譯出來的程序。需要再編譯時加上 -g 參數。gdb才能進行調試。有點像VC的debug。

make.exe
  這是一個非常有用的程序,可以用來發布程序和編譯複雜關係的代碼組。其實有點像提示符版的安裝程序。不同的是,安裝程序是一段二進制執行代碼,而它是一個文本文檔。
  make所執行的是makefile文件。文件是一個文本文檔,裏面包含了程序的編譯規則。如果要用提示符調用的話可以用如下方法。

make -f makefile

然後,make會根據makefile所提供的編譯關係進行編譯和安裝。下面是一段makefile的內容。請注意,其開頭的空白是 tab。

release : main.o
 gcc main.o -o main
main.o : main.c
 gcc -c main.c -o main.o

然後,通過命令 make -f makefile release 就可以執行了。
make會根據文件的創造日期來判斷是否要對main.o進行重新編譯。也就是說,make可以知道作者修改了哪些文件,並將修改過的文件重新編譯。再連接成程序。這樣有助於開發者節省開發週期上的時間和精力。

好了,希望上面的介紹能讓各位滿意。在此,我只介紹一些主要的程序,不一一介紹其他的了。接下來我們介紹一下gcc生成的文件。

*.o 其實就是VC生成的*.obj
lib*.a 就是VC中用的*.lib靜態鏈接庫。只是,每個庫必須用lib開頭。在調用的時候,只要提供*的內容就可以了。
*.so 雖然在Win32中很少用,幾乎不用但,還是介紹一下。這個就是Win32中的*.dll動態連接庫。但是,在Ming32中已經支持dll了。

好了,關於gcc的介紹就到這裏。下面我們開始進入正題。

 

第一章 安裝Dev-Cpp


  在這裏,我不介紹Mingw32如何安裝。因爲Dev-Cpp中已經包含了Mingw32。如果您想了解Mingw32如何安裝,可以查看其他相關的資料。這裏不作闡述。
  首先,我們必須下載一個Dev-CPP的安裝程序。Dev-Cpp的官方網站是
http://www.bloodshed.net。Dev-Cpp的網頁是http://www.bloodshed.net/dev/devcpp.html最新版本應該是Dev-Cpp 4.9.9.0它的下載地址是 http://umn.dl.sourceforge.net/sourceforge/dev-cpp/devcpp4990setup.exe 。這個下載的文件中包含了全部的內容。在得到安裝程序以後,我們就來安裝了。
  不論如何,我想,安裝這種小問題,我想不用再一步步介紹了吧。畢竟我們都是程序員,如果,連安裝都不會那真是……。不過,如果在安裝中有什麼問題,可以提出。我會盡力幫你解決的。
  雙擊安裝程序後,就按照平常安裝的方式安裝,建議按照默認安裝。當然安裝的路徑就算便你了。在第一次安裝以後,程序會提示你界面的設置。如果你喜歡英文就選擇English。如果喜歡中文的,就選擇Chinese。注意不要選擇Chinese(TW)除非你安裝了繁體中文。並喜歡繁體中文。然後是圖標設置。推薦你使用New Look。如果你喜歡其他的也可以。還有就是是否使用XP風格。這些都隨便你了。
  好了就介紹到這裏,到此。我已經介紹了Dev-Cpp的安裝,如果順利。你們運行以後,就會看到如下的界面。

  接下來介紹一下,有關Dev-Cpp在windows中的設置。由於GCC有很多的東西是要在提示符下進行操作的,特別是爲Dev-Cpp安裝,編譯一些工具包。所以,我們就Mingw32添加到系統命令中,有助於以後方便調用。
  方法很簡單,右鍵單擊 我的電腦。然後選色屬性。使用 高級 選項卡。點擊環境變量按鈕。點擊 Path 項,點擊編輯按鈕。然後將DevCpp安裝目錄中的bin目錄的路徑添加到這個選項值的後面。注意,使用 ; 分隔。確定後啓動命令提示符。輸入 gcc -v 看。一切都好了。現在你就可以像在Linux環境下一樣在Win32環境下編譯程序了。

至此,您的Dev-Cpp環境就算弄好了。下面我們將介紹如何製作程序。

 

第二章 新建項目與編譯


  本章我們要進行實戰訓練了。介紹一下如何在Dev-Cpp下進行項目新建和編譯。我相信你一定會慢慢喜歡上這個編譯環境的。
  點擊文件菜單,選擇新建,點擊工程。在出現的對話框中選擇你所需要的程序種類。如下圖所示。

 

 

  其中,Windows application是Win32圖形界面。Console Application是Win32控制檯程序。Static Library是Win32的靜態連接庫。DLL是Win32的動態連庫。Empty Project是更具已有的項目類型創造一個新的項目類型。下面的內容是選擇使用的語言,如是C語言還是C++語言。還有就是項目名稱。這個名稱將作爲程序編譯後的可執行程序的名稱。
  在這裏爲了方便敘述,我們就新建一個Console Application項目好了。至於使用的語言,就隨便你了。我這裏就用C語言爲例了。點擊確定後,提示項目保存的路徑,建議您選擇其他路徑不要使用默認的路徑,因爲默認的路徑是安裝目錄。如果放在那裏的話,會很混亂的。在其他目錄中,新建一個文件夾(當然不新建也可以,只是這樣便於管理)將項目保存在那裏。然後,在點擊保存按鈕(這個按鈕就是一張磁盤,和Windows裏的一樣)或者從文件菜單中選擇保存或者Ctrl + S。這些都可以。這樣,Dev就會提示你項目中默認文件的保存目錄。通常名爲main.*。選擇一個路徑,保存就好了。(建議和項目文件保存在一起)

  下面我們就來編譯程序了。點擊工具欄,第二行,第一個彩色的按鈕。就進行編譯了。這時會出現一個編譯窗口,顯示編譯的進度。你可以通過環境選項來設置它。在編譯完成後,點擊第二個白色的按鈕,就可以運行程序了。是不是很方便?我也是那麼覺得。

  接下來,我就來介紹一下,有關項目目錄內的文件的作用。

main.c 程序的C語言源代碼。
main.o main.c的二進制代碼。
Makefile.win 就像我上面所說的,這個是項目的Makefile文件。用make命令可以編譯程序的。
*.dev *的內容視你項目的名稱所定。這個是項目文件,用於記錄你對項目的設置。有關文件內個字段的作用就不做介紹了。
*.exe 你所生成的可執行程序。

最後,我介紹一下如何不用IDE來編譯生成程序。
首先進入您項目所在的目錄。然後用如下命令。

make -f makefile.win all

就可以編譯了。當然,也可以直接通過編譯源代碼來實現。具體的方法,我已經在開頭介紹過了。這裏就不再重複介紹了。

 

 

文外音:
 
文章就暫時介紹到這裏,以後還會繼續介紹。有關Dev-Cpp/Mingw32更多的內容以後會一一爲各位展示。敬請期待。
另外,還希望各位多多指教。我的格言:不論是程序還是思想,唯有通過不斷的交流才能愈加完善。

 

STUDIO 軟件開發組

北斗星君(黃庠魁)

Dev-Cpp/Mingw32 環境介紹(2)

上文回顧:


  上文(《Dev-Cpp/Mingw32 環境介紹(1)》)我們知道了該如何安裝和使用Dev-Cpp。並且,知道了一些有關Mingw32的一些用法和一些有關程序的介紹和使用方法。學會了一些基本操作的方法。如新建項目,編譯項目等。這一次,我們將繼續上一次的內容。

第三章 爲你的Dev-Cpp安裝開發包


  對於許多程序員來說,讓一套喜歡的開發包和一個自己喜歡的IDE結合在一起是最高興不過的了。自然我也是。上一次我們瞭解了在Dev-Cpp中如何新建項目。但是,美中不足的是,她似乎只能新建一些簡單的程序。比如 控制檯程序,動態連接庫,靜態連接庫等。似乎要完成一項複雜的工作有些困難。當然,C/C++語言是一門鼓勵代碼重用的開發語言,我們可以對每個新建的項目進行設置,從而使用自己喜歡並習慣的開發包。但是,這或許太過於繁瑣了。而且,安裝,編譯這些開發包的文件也太過於麻煩了。所以,Dev-Cpp也就爲各位開發者提供了 包 的概念。
  在Dev-Cpp中有一個包管理系統。使用這個系統,你可以方便的安裝各種開發包。有了這個,你的Dev就會越來越順手。那就像《人月》中的一篇文章的標題《Sharp Tool》(銳利的工具)那樣了。下面我們就來一步步學習如何安裝開發包。
  首先,我們必須有一個已經做好了的開發包。我們可以從Dev-Cpp的官方網站獲得。這裏是開發包的下載頁面的地址
www.bloodshed.net/dev/packages/index.html 在上面你可以找到很多你熟悉的工具。當然,如果沒有也有和你喜歡的工具類似的工具。如果,你覺得這些工具太古來了,或者還不夠。在頁面的下方就有一些鏡像站點的地址。通常,這些鏡像的內容要比主站豐富許多。所以,你可以從很多途徑得到這些包。現在我們就隨便下載一個作爲演練。如果你不建議,我們就下載一個Fast Light Toolkit。當然,你也可以下載其他包。我這裏只是作爲講解。
  在下載完成以後,我們將會得到一個後綴名爲 *.DevPak 的文件。這個就是開發包文件。這個文件的使用和我們平時使用的安裝文件一樣。不同的是,安裝文件會修改註冊表,將安裝信息些進去。如果系統重新安裝,就需要重新安裝程序。而這個安裝文件不會將安裝信息寫入註冊表。並且,只要安裝程序的目錄沒有刪除。下次安裝的時候,就不許要再安裝了。除非使用的Mingw32過新或者過舊無法支持。現在,我們好好的保存這個文件。
  接下來話分兩頭,我們來介紹一下 Package Manager 這個程序你可以用兩種方法啓動。一種是點擊Dev中的工具菜單,選中最後一項的Package Manager。另一種方法是到安裝目錄中,直接運行 Packman.exe 。運行以後你就會看到如下的一個界面。

如果,你運行以後沒有看到左側的工具欄或者上面的工具欄。你可以在View菜單中將其中的選項全部選上就可以了。下面介紹有關操作的一些方法。其中,Install按鈕是用來安裝開發包了。而Verify按鈕是用來檢查開發包的完整性的。而Remove按鈕是用來刪除開發包的。這個界面中間空白的部分是顯示開發包圖標的,左側的工具欄是用來顯示開發包信息的。其中包括開發包的名稱、版本號、介紹和提供的站點等信息。上方的工具欄是用方便用戶操作的。基本上菜單中有的。工具欄上都有了。所以,普通的工作工具條就可以完成了。

  好了,到這裏。我們的話再說回來。所謂言規正傳,大概就是派這個用場的吧。(怎麼突然想到魯迅先生的《阿Q正傳》呢?真奇怪。)我們介紹一下安裝包的方法。
  安裝工具包的方法有兩種,當然是我常用的兩種。至於有沒有其他方法。自然也有。只是我個人還是比較喜歡這兩種。如果哪位有什麼比較怪誕的方法自然也可以用。只要能夠順利使用,用什麼方法都是可以理解的嘛。所謂條條道路通羅馬嘛。有些時候,我們不必過於計較方法,我們要的是結果。
  第一種方法,就是像我們平時使用安裝程序一樣。直接雙擊那個工具包。Package Manager 會很熱情的跳出來幫你完成任務的。然後,你就更具提示一步步的走就可以了。這種方法的確很不錯。只是覺得用起來不夠專業。如果被人看到,會被別人認爲是菜鳥的。所以,我這裏爲大家隆重介紹第二種安裝方法。首先你先運行Package Manager 然後點擊Install按鈕。她會提示你告訴她工具包的位置。只要選擇好工具包,點擊確定。剩下的就和第一種方法一樣了。這種方法看起來會比較老鳥一點。不過太麻煩了。不是麼?那麼是不是我們要在菜鳥和老鳥種做選擇呢?當然不用。我個人意見是,平時就用第一種方法。有人請教什麼的,就用第二種方法。
  好了,安裝好以後。我們會看到Package Manager中會多一個圖標。這個就是你剛纔安裝的工具包。如果覺得用起來不爽就選中她然後按Remove就可以了。
  下面你可能會問我,我安裝完了。改如何用呢?問的好,值得表揚。這個問題嘛……當然是很簡單的啦。要是連這個也不能回答我怎麼能在這裏說,你在那裏聽呢?(誒,原本想早點說完回家睡覺的……)對於不同的開發包,使用的方法會有所不同。如果是IDE自身的開發包。那麼,你在使用IDE的時候IDE會在運行時調用的。就不用你操心了。要知道,一個人操心太多會多很多皺紋和死很多腦細胞的。而一些開發工具就可以在新建工程中看到,至於具體在哪裏要看具體的包而定。
  接下來我還是以Fast Light Toolkit爲例。來說明包的使用方法。Fast Light Toolkit是一個GUI開發包。(我想你該知道什麼是GUI吧,說的簡單一點就是Graphical User Interface。說得複雜一點,就是用戶界面)好了。我們現在開始新建一個工程,這個在上文中已經介紹過了。不過這次在確定項目的時候有些改變。這次,我們在點擊新建工程後出現的對話框中,選擇GUI選項卡。然後選擇FLTK。因爲FLTK是用於C++的。所以,我們這裏只能用C++而C是不可選狀態的(怎麼有硬來的感覺)。接下來的一切和上次我們說好的一樣了。Dev會自動生成一個main.cpp的文件。裏面有一些基本的代碼。保存後編譯,運行。可以看到一個你仰慕以舊的Windows界面。(啊,終於看到你了,窗口)我想,那麼聰明的你應該會舉一反三,知道其他的工具包如何使用吧。所謂,師父領進門,修行靠自身。我也不可能一步到位啊。
  最後,我想請你們注意一下。在安裝包之前,先要看清楚有關包的說明。因爲有些包是有依賴關係的,必須在安裝某個包之後再安裝她。這就像,要知道有些時候同樣的結果是不能將操作的順序顛倒一樣。比如,你必須先有個妻子,然後纔有個兒子。(除非特殊情況)

第四章 工程的導入與導出


  四這個數字總是不太吉利。在中國是這樣,在國外好像也這樣吧。既然我們不能跳過四,直接到五(因爲那樣,別人會認爲是不是自己漏看一章而覺得遺憾終生的)所以,我就在這章介紹一些無關痛癢的東西。就算不吉利也不會影響到我們開發的。
  對於用慣VC開發的人。有許多項目在Dev下開發還要重新在設置和編寫,會覺得很頭痛。所以,Dev就在她的裏面加了一項將VC6.0的工程文件轉換成Dev的工程文件的功能。(這句話好繞口啊,下次把它改成繞口令算了)是個好消息吧。
  首先,我們必須有一個VC6.0的工程做測試。沒有也沒有關係,看看長長見識也不錯。反正這章講的是不關痛癢的內容。接着,我們開始導入了。選擇文件,導入,導入Visual C++ Project。點擊後,會出現一個對話框。在第一個選項選擇*.dsp的路徑(填入也可以,只要你能把完整路徑寫出來)。選擇完畢後。對話框就會出現有關該項目的一些屬性。你只要選擇就可以了。比如,第二個框內的內容就是問你是導入那種生成配置。Debug或者Release還是其他什麼的。第三個框內問的是你要將Dev的項目文件放在哪裏。(當然是在你自己的計算機上,還有哪裏?難道讓勇氣號帶到火星上不成?)全部選擇好以後就可以了按確定了。在等待一段時間後(具體長短,要看你的程序體積如何,如果像VC編寫的Linux Kernel。那麼是要等一段比較長的時間。如果有的話)。現在開啓Dev項目看看。怎麼樣,一切正常吧。是不是很興奮?或許有人要問,這麼重要的功能爲什麼說是無關痛癢的功能呢?其實,更具我使用下來的情況。導入的代碼能夠成功編譯的,算是你幸運的要準備去買六合彩了。因爲,直到現在我還沒有導入過一個可以成功編譯的項目。(如果你可以,記得一定要告訴我,好讓我見識一下傳說中的可導入工程)。
  下一個功能是導出。這個功能當然不像上一個功能那麼那樣。不過,功能對於一般的開發者不會有太大的用處。你可別以爲這個導出和上面的導入是相對的。就是把Dev工程導出成VC6.0工程。這個導出,是講C/C++的文件工程導出成網頁形式。或者寫字板形式的。如果你是像用這個工程做教程的確實是一個很不錯的功能。不過,開發者還是編寫代碼大於寫教程吧(好像我是個不務正業的開發者)。所以,我認爲這個功能是有些無關痛癢。下面介紹一下使用方法。
  選擇文件,導出後,會有三個選項。到HTML,到RTF和工程到HTML。第一個和第二個是對單個文件進行導出。而第三個是對整個工程進行導出。(就是所有的代碼)第一,第二個的導出文件我也不用介紹了。反正也就那麼一個文件。我具體的介紹一下第三個所生成的文件。第三個生成了一個*.html,*的內容是由你決定的。和一個名位code的文件夾。裏面包含了轉成html文件的程序代碼。當然,這些代碼都是有色彩提示的,很不錯。這樣看來,所謂的導出工程,其實就是將整個工程文件轉換成一個類似於網站樹型結構的功能。所以說,這個功能用於說明代碼是很不錯的。
  好了介紹到這裏,介紹了一些無關痛癢的功能。我想,你們也許也對Dev-Cpp有一個大概的瞭解了吧。如果,你想知道更多的關於導入和導出的功能的介紹。可以提出來。大家一起來解決嘛。

 

文外音:


文章就暫時介紹到這裏,以後還會繼續介紹。有關Dev-Cpp/Mingw32更多的內容以後會一一爲各位展示。敬請期待。
覺得這次的文章,好像沒有上次那麼有含金量,而且寫作風格也有所改變。如果你喜歡這種風格我以後會多運用,如果不喜歡請你說出喜歡那種風格的。我會作爲參考的。
另外,還希望各位多多指教。我的格言:不論是程序還是思想,唯有通過不斷的交流才能愈加完善。

 

STUDIO軟件開發組

北斗星君(黃庠魁)

Dev-Cpp/Mingw32 環境介紹(3)

上文回顧:


  上文《Dev-Cpp/Mingw32 環境介紹(2)》向各位介紹了一些有關Dev-Cpp的功能,其中有包的安裝和一些小功能。希望能得到你的滿意。這次,我們就繼續介紹Dev-Cpp的其他功能。其實,說句實話。對於GNU的東西,我個人覺得還是提示符下用的舒服。我也不知道爲什麼。有很多功能,在提示符下很簡單的打幾個字符,可以完成像Windows的IDE需要點很多鼠標才能完成的功能。我說這個並不是沒有道理的空穴來風。本次我將爲你展現我這一觀點。

 

第五章 在Dev-Cpp下的程序調試

 

  對於任何程序員來說,程序的調試是再需要不過了。如果沒有程序調試,那麼程序的穩定又從何說起呢?現在我們就來看看如何使用Dev來調試我們親愛的程序吧。
  衆所周知,GNU有一個非常棒的調試程序GDB,可是由於常常使用VC。所以,對於這個許多人都有所而聞而未目睹這一程序的芳容。現在我們就來掀開他的蓋頭來。首先,我們超常,啓動Dev-Cpp這次我們要做的是在Dev-Cpp下調試程序。在Dev-Cpp下,調試程序並不像在VC下那樣有專門的程序界面來做。他的調試界面就在代碼框的下面。只要選擇下面的 調試 選項卡就可以看到調試界面了。
  在各位看到調試界面後,會不會有一種淒涼的感覺?其實我已經淒涼了好幾年了。大家也就將就一下了。其中調試選項卡中還有三個選項。調試,回溯,輸出。其中,調試就是將一些調試的命令做成按鈕,方便各位操作。不過我個人覺得這個功能說方便也不方便。因爲有些時候就是很簡單的一個操作也會讓使用的人手忙腳亂的。回溯,是將GDB調會的有關函數的信息顯示出來,這個功能還不錯。輸出,是將用戶的GDB命令直接輸出給GDB程序,沒有按鈕了,不過這個界面有個不太好的地方,就是顯示GDB返回信息的窗口太小了。有種管中窺豹的感覺,很不舒服。
  話說那麼多,覺得有些羅嗦。各位是不是手癢癢了?(該不是小兒多動症吧?)現在隨便開啓一個程序,最好是代碼行數多點的,參數多點的,函數多點的,提示符界面的程序。因爲,這個可以幫助你們瞭解基本的運行機制嘛。
  點擊調試窗口的調試按鈕,如果你的程序沒有調試信息,那麼Dev會提示你是否重新編譯程序加入調試信息。選擇是。然後程序將使用Debug方式重新編譯連接程序。在完成之後。我們就開看看自己的程序吧。首先,我們先要運行GDB。在次點擊調試,或者將編輯區的光標移動到你要運行到的位置點擊運行到光標。然後,程序就開始運行了。其中,你會看到在編輯區中有一個藍色的條子。這個就指示你該程序運行到何處了。如果你願意,可以繼續向下運行一行。你只要點擊 下一步 就可以完成。對於其他有關GDB的操作,比如代碼的查看,變量的查看,函數的信息等等,只有通過輸出來完成了。選擇輸出,然後在輸出中的字符輸入框中輸入你的GDB命令。比如:list 這個命令將在下面的字符框中列出程序的代碼。當然,你要上下找找,因爲框太小,看起來很麻煩。
  好了,有關IDE中的調試,本人就介紹到這裏。在深入的東西,當然也沒有深入的東西了。再深入的話,怕我沒有累死,大家可要看着煩死了。其實上面介紹的一些操作如果再提示符下很容易就Ok了。更本不需要那麼複雜。我想,可能這也是Dev不能流行的一個主要原因吧。因爲界面的操作太不人性化了。

 

第六章 在提示符下的程序調試


  上一章中,我們領略了Dev-Cpp下的調試。真是讓人有些不感恭維。接下來我們來欣賞一下標準,經典的GDB調試。如果各位對Linux等系統有所瞭解的話,應該知道提示符是許多經典軟件的常用界面。所以,要使用一些經典的東西,看來還是要在提示符下多熟悉熟悉了。當然,這裏的提示符並不像各位想的那麼麻煩,要有上百條命令要記憶。其實,像GDB這樣的程序,基本就是一個很簡單的命令就可以解決了。而且非常靈活。
  接下來我就來介紹一個GDB的調試。
  首先我們必須要一個可以調試的代碼。現在我們用gcc main.c -o main -g來生成可調試的代碼。然後用gdb main 來啓動gdb。是不是沒有想象的那麼複雜啊?如果順利您會看到一段GDB的版權信息,接着是(GDB)這樣一個提示符。現在您就可以對GDB下命令了。
  看看程序代碼。如果,我們想看看調試程序的源代碼而又不想開啓main.c這個文件(更多的原因是要爲後面設置斷點等來做鋪墊)。那麼我們可以輸入list或者,l就可以查看程序代碼了。是不是啊?看來提示符並沒有像我們想象的那麼可怕。
  運行程序代碼。雖然調試是可以那麼我們該如何在調試的時候運行代碼呢?很簡單。輸入run或者r就可以運行了。如果前面設置過斷點,那麼使用這個命令可以讓程序運行到斷點。
  爲調試設置斷點。使用break可以設置斷點,讓調試程序在斷點停止運行的程序。break 後面必須有一個參數。參數可以是行號。如,break 10 就是在第10行設置斷點。也可以是函數名稱break main就是在main函數處設置斷點。
  查看程序變量。如果您像查看程序中的變量,可以用paint或者p命令來實現。這兩個命令後必須加上變量名稱。如 p argc就是顯示argc的值。而使用info命令可以查看相關的信息,如內存位置什麼的。
  一步步運行程序。如果您像在斷點後一步步的執行程序,可以用n或者next命令來執行下一行代碼。
  退出調試。輸入q退出程序。

  是不是覺得提示符下的調試要比IDE中的簡單?你不要以爲這就是GDB的全部功能。我在這裏只是爲各位展示一下GDB。如果各位要了解更多的關於GDB的使用方法。可以查看技術手冊或者到網上尋找相關的文章,可以找到很多。
  最後,如果對於GDB和調試程序有什麼疑問,我們可以一起探討。


文外音:


這次的文章好像很短,我也覺得。但是,沒有辦法。所謂衆口難調。這一章總是要講的。乾脆提早一些寫好。下一篇我們將進入項目的建立和靜態庫的使用。我想一定會讓你感到興奮的。最後,希望你能夠多多指教。我的格言:不論是思想還是程序,唯有通過不斷的交流才能愈加完善。

 

STUDIO軟件開發組

北斗星君(黃庠魁)

Dev-Cpp/Mingw32 環境介紹(4)


上文回顧:


上文《Dev-Cpp/Mingw32 環境介紹(3)》向各位介紹了有關使用GDB調試程序的簡單方法。本文我們將會看看Mingw32如何來使用靜態連接庫。雖然本文出爐的時間的確是有些慢了點。不過我想各位應該能夠理解的。

第七章 在你的程序中使用靜態連接庫


  在Windows中也許各位都會熟悉以obj和lib結尾的文件。這些文件就是Win32下的二進制文件和靜態連接庫。但是在Mingw32下有些特殊,我原來在第一章介紹過的。他們是o和a。很奇怪吧。不過我們這裏只要知道如何使用就可以了。關於更多的不在本文的範圍內。
  我們先以VC爲例,各位知道在VC中使用靜態庫,要在連接程序的時候選擇導入的靜態庫。參數爲靜態庫的全名。比如winmm.lib但是在Mingw32下有些不同。你所使用的參數爲 -lwinmm這個就可以了。而-lwinmm的意思是導入靜態鏈接庫libwinmm.a。是不是有些想不通?下面我們來介紹一下在Dev中的使用和意義。
  首先我們啓動Dev,新建一個工程。然後選擇工程->工程屬性。(如果你使用New Look圖標,那麼工程屬性就是一個盾型圖標。)然後,選擇參數選項卡。在連接器的文本框中輸入你要的參數,如-lwinmm。至於分割符,可以使用空格,也可以使用回車。不過我個人推薦回車。如果順利,你的界面看起來會像下圖。


  當然你如果要使用*.lib可以,只要將文件名直接填入就可以了。就像 winmm.lib。當然如果用絕對路徑也可以。
  下面我們來看看靜態連接庫的格式。當然,我們不是從文件格式去分析,而是從調用格式看。通常靜態庫的文件名爲 lib*.a其中*表示的就是任何字符。而在我們調用的時候,不需要將所有的文件名都用上,只需要使用*的內容就可以了。就像調用libwinmm.a的靜態庫我們只需要在連接的時候加參數 -lwinmm就可以了。前面的lib和後面的.a都不需要了。如果,還不太明白。可以看看dev安裝目錄中的lib目錄。裏面有很多win32下的靜態連接庫。自己分析一下文件名和調用方法就會很清楚了。
  最後我們實戰一下靜態連接庫的使用。
  寫什麼好呢?寫一個控制檯上的音樂播放器吧。當然只是簡單的播放音樂而已,而且路徑不支持中文。這裏只是爲了熟悉一下靜態庫的使用。
  新建一個控制檯工程,然後我們在main.c的代碼中寫如下代碼。

//main.c
#include <windows.h>
#define MAX 255

int main(int argc, char *argv[])
{
    if (argc == 2)
    {
        char filename[MAX];
       
        strcpy(filename, "open ");
       
        strcat(filename, argv[1]);
       
        strcat(filename, " alias media");
       
        mciSendString("close media",0,0,0);

        mciSendString(filename,0,0,0);

        mciSendString("play media",0,0,0);

        system("pause");
    }
    else
    {
        printf("play.exe musicfilename");
    }

    return 0;

}
//main.c end

然後我們在工程屬性的連接器參數中輸入 -lwinmm 好了。開始編譯。如果順利,我們的程序就會編譯成功。並且可以播放一些常用的音樂文件。高興吧。

好了,這章我們就到這裏用這個例子結束了。

問外音:
由於本人最近比較忙,所以原來的兩章一文改成了一章一文。請原諒。下一章我們將介紹如何建立Mingw32的靜態連接庫。敬請期待。並且希望各位能夠多提意見。因爲不論是程序還是細想唯有通過不斷的交流才能愈加完善。

 

STUDIO軟件開發組

北斗星君(黃庠魁)

 

Dev-Cpp/Mingw32 環境介紹(5)


上文回顧:


上文《Dev-Cpp/Mingw32 環境介紹(4)》我們介紹瞭如何使用 靜態連接庫。今天我們介紹如何製作自己的Mingw32的靜態鏈接庫。至於Win32下的那種靜態連接庫我想熟悉Win32的人應該很清楚如何製作。所以我們這裏就不做介紹了。

 

第八章 製作自己的靜態鏈接庫


  這是第八章,八這個數字很多人都喜歡。我也一樣。(感覺好迷信啊。)這一章我們要來製作靜態鏈接庫,我相信各位一定會很高興的。
  首先我先簡單介紹一下靜態鏈接庫的作用。我們知道,C/C++程序生成目標代碼的過程有,編寫代碼,編譯代碼,連接代碼,生成目標代碼。在連接代碼的時候,會將編譯後的二進制代碼連接成目標代碼。但是,有些時候。我們想讓程序導入必要的代碼,而不想導入無用的代碼到我們的程序中。我們該如何呢?很簡單,使用靜態連接庫。使用它我們就可以實現將在程序中使用的函數導入的目的。
  下面我們來一步步的學做靜態鏈接庫並且學會如何使用。
  我們現在先寫一段代碼,你可以用Dev也可以用記事本也可以用任何你喜歡的文本編輯器。像我就比較喜歡vi或者emacs作爲平時的文本編輯器。話說遠了,現在言規正傳。我們寫下下面的代碼。

//HelloWorld.c

#include <stdio.h>

void HelloWorld(void)
{
        printf("Hello World");
}

上面那段C代碼各位應該很熟悉的吧,那麼經典的Hello World好讓我懷念啊。保存爲HelloWorld.c以後我們就開始生成了。
首先,我們先編譯HelloWorld.c

gcc -c HelloWorld.c -o HelloWorld.o

這樣我們得到一個二進制的文件HelloWorld.o

接着我們生成靜態庫。

ar cqs libHelloWorld.a HelloWorld.o

這樣我們黨額靜態鏈接庫就好了。如果有需要可以將其他的二進制文件名加HelloWorld.o的後面將他們連接成一個靜態鏈接庫。另外,生成的靜態庫文件名必須爲lib*.a

好了,現在我們來使用我們的庫吧。

接下來,我們爲了能夠使用方便,寫一個如下頭文件。

//HelloWorld.h
void HelloWorld(void);

接着我們開始使用我們剛纔生成的靜態庫。寫一個main.c的文件。

//main.c

#include "HelloWorld.h"

int main(void)
{
        HelloWorld();
        return(0);
}

使用gcc編譯,假設我們這裏所有的文件都保存在同一個目錄下。

gcc -c main.c -o main.o

然後我們連接程序。

gcc main.o -o main.exe -L"./" -lHelloWorld

如果順利我們會得到一個main.exe的文件。

在控制檯下輸入main.exe或者main就可以出現 Hello World 這組單詞。

看了上面的文章是否很興奮想要生成自己的靜態鏈接庫?其實,我個人覺得mingw32生成靜態鏈接庫要比VC生成的簡單。不知道你有沒有這樣的感覺。

當然,如果你要在Dev下使用靜態連接庫,也是可以的。方法我在上一章已經說過了。只是,如果你要使用自己的庫必須設置路徑。

只要在連接器參數中添加 -L"你的庫的所在的文件夾" 或者 將你的庫保存到Dev安裝目錄中的lib目錄中。

好了,本文就介紹到這裏。如果有什麼問題,可以在這裏留言。

問外音:


這篇文章其實我真的很喜歡,不是文章喜歡,而是內容很喜歡。不知道各位如何想。這裏介紹了一個生成靜態庫的方法,感覺比VC生成的要簡單。其實在gcc的Linux平臺下生成動態連接庫還要比VC下生成不知道要簡單多少倍了。如果說Win32中用於開發最好的平臺是win2000那麼,在那麼x86系統中用於開發的平臺莫過於Linux了。這章的內容也許對許多的程序員都有些陌生,我實在擔心各位會在實踐中會碰到問題,所以在這裏還是希望各位在遇到困難時多到這裏提問。最後還是我的一句名言:不論是程序還是思想唯有通過不斷的交流才能愈加完善。(看過《古畑任三郎》麼?主角總喜歡在發表觀點後,說一句:我是古畑任三郎。感覺我也和他一樣了。不過,這的確是一部不錯的影片。至少比國內許多偵探片都好,沒有額外的劇情,沒有你你我我的愛情。純粹是從一個破案的角度來拍攝的。推薦各位看看。)

 

STUDIO軟件開發組

北斗星君(黃庠魁)

Dev-Cpp/Mingw32 環境介紹(6)


上文回顧:
上文《Dev-Cpp/Mingw32 環境介紹(5)》中,我們瞭解瞭如何來製作靜態連接庫。的確,上一片文章至今已經很長時間了。所以,我這次會用更多的內容來回報各位讀者的。下面我們就來說說如何製作動態鏈接庫。

第九章 製作自己的動態鏈接庫

  “我沒有做夢吧,Mingw32也能做win32的動態連接庫?”對你沒有做夢,我也沒有胡說。下面我簡單介紹一些動態庫的生成和使用。
  還是老樣子,我們來開啓Dev-Cpp,然後我們新建工程。選擇DLL工程。這個就是我們的鏈接庫。在新建以後,我們會生成一個dll.h和一個工程名.c文件。其中,dll.h中保存的是你動態庫的函數。下面我們看看我的文件內容。

//dll.h
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


#endif /* _DLL_H_ */

#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}

DLLIMPORT int HelloWorld(void);

//dll.h End

其中我在最後一行加入了自己的函數,HelloWorld。

下面我們來看看我的HelloWorld.c

//HelloWorld.c
#include "dll.h"

DLLIMPORT int HelloWorld(void)
{
    printf("Hello,World!");
    return(0);
}

//HelloWorld.c End

好了,我們就來編譯吧。使用Dev的編譯命令或者用如下命令。

我們將會得到兩個文件。一個libHelloWorld.a,一個HelloWorld.dll。我們使用這兩個文件就可以編程了。

文外音:
說實話,這次這篇文章和前幾篇文章相比間隔確實有些長了。由於我前一階段有些忙了,所以,這次爲各位讀者抱歉了。下面我們要學的是如何使用剛纔我們編寫的動態庫。

第十章 使用自己的動態鏈接庫

上文回顧:
上文,我們介紹瞭如何生成動態庫。下面我們就來使用它吧。

新建一個工程main.c的文件如下

//main.c

#include <stdio.h>
#include <stdlib.h>
#include "dll.h"

int main()
{
  HelloWorld();
  return(0);
}

//main.c End

現在將剛纔那個工程中的 dll.h libHelloWorld.a HelloWorld.dll文件複製到你現在工程的目錄裏。

然後,我們現在開啓工程屬性。在鏈接器一欄中加入

-l"HelloWorld"

保存工程後編譯。一切成功後,我們就獲得了使用動態鏈接庫的方式了。以後我們只要修改鏈接庫的HelloWorld就可以修改程序中的顯示。希望這篇文章各位能滿意。

文外音:
的確,現在很忙,所以文章的質量也下降了不少。不過還是希望給爲能夠多多諒解。最近在搞NASM彙編。發現其實Emcas和Nasm確實很不錯。非常喜歡。不過,C我還是會追求的。只是,可能以後和各位的交流會少些,但是我還是會用我的文章來使各位獲得有關Dev的內容。本系列文章,未完,待續。






STUDIO軟件開發組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)

上文回顧:
在上一篇中,我爲各位介紹瞭如何製作包文件,和新建一個自定義的工程。下面我按照約定,要介紹wxWidget的安裝。本文適合Dev-Cpp和Mingw32編譯器的。

第十四章 wxWidget的下載與安裝

  這一章我將爲各位介紹如何下載安裝wxWidget這個GUI開發庫。
  首先,我們先要知道,我們是在win32下使用wxWidget的。所以,我們現在要下載的是wxMSW這個開發庫。MSW我想你也知道是什麼意思。直到這篇文章寫出來,wxMSW的最新版本是2.5.3。現在你可以從
www.sf.net上下載,也可以在如下地址下載。http://umn.dl.sourceforge.net/sourceforge/wxwindows/wxMSW-2.5.3.zip。都是一樣的。我通常喜歡用umn.dl.sourceforge.net的下載。偏愛吧。還有,wsMSW-2.5.3.zip是一個免安裝的wx。而另一個wxMSW-2.5.3-setup.zip是需要安裝的。差別不是太打。如果問我,我比較喜歡wxMSW-2.5.3.zip。
  然後,我們就在你的驅動器上建立一個目錄叫 wxWidget-2.5.3。並把壓縮包裏的文件解壓到該目錄中。注意要全部解壓。當然如果你想少解一點(至少我全部都要)你可以解如下的文件夾和文件。不過注意,路徑不能更改。否則的話麻煩就大了。(也就是說原來的路徑是 build/msw/makefile.vc 你不能用makfile.vc替代)

build/msw/config.gcc
build/msw/makfile.gcc

include/
lib/
src/

還有一個contrib這個目錄其實並不是很重要。至少你在平時使用中不會很多的用它。如果需要你可以解開,但是通常只有在需要的時候纔會編譯。

這樣我們的庫就算安裝好了。當然,如果你是Dev-Cpp的朋友。你可以按照我前面介紹的自定義工程,來設置工程的參數。這裏,我們在編譯器參數中加入

-I(安裝目錄)/include/

連接器參數加入

-L(安裝目錄)/lib/

好了,這章就到這裏了。

第十五章 wxWidget的編譯與用wxWidget編譯程序

  現在我們用cmd.com進入build/msw。如果你按照我在第一章介紹的方式設置了。那麼輸入

make -f makefile.gcc

讓make來編譯程序。在一陣狂編之後。我們就算安裝好了wxWidget。這是我們就進入demo/bombs/這個目錄,輸入

make -f makefile.gcc

就可以嘗試我們編譯的結果了。你可以將提示符出現的編譯參數作爲鏈接參數和編譯參數給Mingw32使用編譯自己的工程。

編譯完成後,你會看到在bombs的gcc_debug目錄裏有一個文件bombs。運行一下,一個掃地雷出現了。(我一直不會玩掃地雷,也許我的智商不高)。也許你會下意識的看看文件的體積…… 哇!你會恐懼的發現這個程序要 12MB 那麼大……。你不用害怕,因爲這個是調試用的庫。所以加入了大量的調試內容。12MB也是應當的。

  好了,現在我們來編譯一個小小的wxWidget庫。還是一樣,我們在編譯的時候要使用一個參數。我們在build/msw/下輸入

make -f makefile.gcc BUILD=release

好現在,我們就可以得到release的庫了。同樣,編譯一下bombs來看看。進入gcc_release目錄,程序一樣運行,但是體積卻小了N多。如果壓縮一下,程序還會更小都不滿1MB。

  但是,我們還要更小更小的庫。通常,現在網上絕大部分都介紹到上面第二種編譯方式,這已經相當不錯了。通常只有第一種。下面我就來介紹一下一個比較特別的編譯方式。

  如果各位用過MFC就會知道,其實MFC使用的是動態鏈接庫,這樣可以加大重複代碼的利用率。如果更新主程序就不需要更新動態庫的內容了。所以,我下面介紹如何把wxWidget編譯進動態鏈接庫中。
  同樣我們要進入build/msw/目錄。同樣用make。輸入

make -f makefile.gcc BUILD=release SHARED=1

首先注意大小寫,另外,release參數是必須的,否則就會生成那種可怕的恐龍文件。但是缺點是不能對wxWidget進行調試。在一段時間的編譯後,我們就會在lib/gcc_dll中得到動態鏈接庫和庫文件。如果你想長期使用,就把*.dll複製到 ~/system32/目錄中去好了。或者設置PATH值爲該目錄。接下來我們就來編譯bombs測試。輸入

make -f makefile.gcc BUILD=release SHARED=1

這次我們會在gcc_dll目錄中找到bombs。如果直接運行,你會看到錯誤提示。當然如果你把動態鏈接庫複製到/system32/目錄中就不會看到了。我們把bombs.exe複製到lib/gcc_dll/目錄中,運行後,就會看到程序界面。不過……看看體積……我的天,100多KB。夠小了吧。我們就用這個開發wxWidget吧 ^_^

下面列出編譯器的參數和連接器的參數好讓各位創建自定義工程。

編譯器參數:
-O2  -DHAVE_W32API_H -D__WXMSW__    -I(wxWidgets)\include -I(wxWidgets)\lib\gcc_dll\msw -Wall -I. -DWXUSINGDLL -I(wxWidgets)\samples -DNOPCH

連接器參數:
-mthreads -L(wxWidgets)\lib\gcc_dll -Wl,--subsystem,windows -mwindows  -lwxmsw25_core  -lwxbase25   -lwxtiff -lwxjpeg -lwxpng -lwxzlib  -lwxregex -lwxexpat   -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32

其中(wxWidgets)代表你安裝wxWidget的位置。

好了,這次的wxWidget之行就到這裏了。希望你能成功的走過第三步。

文外音:
其實,我早就喜歡用wxWidget了,只是生成的文件實在嚇人。所以遲遲不敢再用。後來轉用gtk。不過我也研究到底怎麼樣把wxWidget體積縮小。所以,這次我徹底的縮小了文件體積。真是一大幸事啊。不過,如果你在編譯的時候發現任何的問題。可以在我的Blog響應文件的後面提出,最好留下你的郵箱地址,這樣我就能以最快的速度回覆你。同時希望你能關注我的文章。
http://blog.csdn.net/visioncat/ 。當然本系列文章還沒有結束。還在補充中。因爲前期很忙,所以幾個月沒有更新造成了有人誤認爲我的文章結束了。哈,不好意思。

補充內容:
  從讀者的回覆中,發現原來本文還是有些地方不很清楚。因此,在這裏做一個小小的補充。
  讀者提出,是否能給出一個更簡單的wxWidget的例子。所以,我在這裏給出一個簡單的makefile文件和一個main.cpp文件給各位。


#makefile.txt
#這個Makefile是針對使用Dll的wxWidget
#請將下面的wxPath的參數./改成你wxWidget的安裝目錄
wxPath=./

CF=-O2  -DHAVE_W32API_H -D__WXMSW__    -I$(wxPath)/include -I$(wxPath)/lib/gcc_dll/msw -Wall -I. -DWXUSINGDLL -I$(wxPath)/samples -DNOPCH

LF=-mthreads -L$(wxPath)/lib/gcc_dll -Wl,--subsystem,windows -mwindows  -lwxmsw25_core  -lwxbase25   -lwxtiff -lwxjpeg -lwxpng -lwxzlib  -lwxregex -lwxexpat   -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32

#Makefile結束


//main.cpp
//這個文件是使用Dll的wxWidget的主程序,是一個窗口(空白)

#include <wx/wx.h>

class MainApp:public wxApp
{
public:
 virtual bool OnInit(void);
private:
 wxFrame *mainFrame;
   
   
};

IMPLEMENT_APP(MainApp)

bool
MainApp::OnInit()
{
 mainFrame = new wxFrame((wxFrame*) NULL, -1, "wxWindows");
 mainFrame->Show(TRUE);
 
 return TRUE;
}

//main.cpp結束

 

好了,這次的補充到這裏就結束了。




STUDIO軟件開發組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)

Dev-Cpp/Mingw32 環境介紹(10)

上文回顧:
在上一文中,我向各位介紹瞭如何使用Dev-Cpp/MinGW來生成wxWidget。我想你們一定是早已經把這個wxWidget做成工程文件了。有關工程文件的製作,請看第十一章。
前一階段比較忙,所以對於MinGW介紹的更新幾乎是停止了(我在研究一些操作系統的寫法)。再加上我對於現在文章的發展方向很迷茫,所以也想不出再介紹一些什麼。所以也就沒有寫。如果各位有什麼建議,我希望能看到你們提出來。

第十五章 SDL的下載和安裝

  對於在Win32下的用戶一定會對SDL很陌生,因爲你們從來沒有聽說過。不過對於Linux下的用戶就不同了,因爲Linux下的跨平臺遊戲開發工具就是SDL。不過,我這裏介紹SDL並不是主張遊戲,而已介紹一下MinGW的遊戲開發環境。當然,SDL除了開發遊戲還有很多其他的用途,我希望你們能善用她。其實,在Win32下的遊戲開發不一定只有DirectX。SDL也是非常強大的。當然如果你用的是MS-C,那麼你的SDL就是建立在DirectX上了。不過,她的穩定性我可不能保證。因爲SDL的官方網站認爲,MinGW的這種編譯是安全版本……

  SDL是一組包含若干媒體操作的工具庫。個人覺得非常不錯。你可以從網上免費獲得她。你可以從她的官方網站 http://www.libsdl.org/ ,或者我常去的 www.sf.net 上找到她。如果你想在MinGW下製作SDL的程序,那麼你必須下載 SDL-devel-1.2.8-mingw32.tar.gz 雖然體積大了點,但是物有所值。不過,如果你只是想運行幾個SDL的軟件,那麼下載一個運行庫就可以了,體積小巧。

  當你下載完成後,你已經成功的三分之一了。下面我就要教你如何安裝和設置這個SDL了。

  打開你的壓縮包,將裏面的文件複製到一個新建的目錄中,我現在假設這個目錄是 (SDL_PATH)。當然,如果你的計算機上沒有解壓縮的工具,那麼你可以從 www.sf.net 上下載GNUWin32中的解壓縮工具,tar,gzip。如果你想偷懶,那麼可以直接將要所包裏的東西直接複製到Dev-Cpp或者MinGW的目錄中。並跳過對編譯器的設置。

  現在我來說一下文件夾中文件的作用。

test/ 目錄中的文件都是一些測試文件,你可以用她來測試你的SDL是否安裝成功。所以,你可以在安裝設置完成後刪掉她,如果你願意的話。
lib/  目錄中的文件是一些庫文件,你在開發中必須要使用到他們,所以千萬別刪。
include/ 目錄中是頭文件,和lib/中的文件一樣重要
docs/ 中的文件是SDL的教程,你可以從中學會如何操作SDL。雖然是英文的,但是還是寫的不錯的,基本不需要很好的英文基礎就可以讀懂。
bin/ 中的文件是SDL程序的運行庫,在開發中不需要,但是在運行時就有大用處了。

  接下來,我們爲Dev-Cpp設置一下環境變量。在你的工程中將 (SDL_PATH)/lib 添加入你的庫路徑中。將 (SDL_PATH)/include/SDL 添加入你的頭文件路徑中。這些我都在前面介紹過了。如果你是MinGW的話,記得在編譯的時候添加哦。

  對於項目,我們除了添加路徑,還要爲程序鏈接提供庫。具體的參數如下。

-lSDL -lSDL.dll -lSDLmain

  上面是在你鏈接的時候,讓ld從 libSDL.a libSDL.dll.a libSDLmain.a 中抽取函數。

  一切,都設置好了,我們就來編譯一個例子看看。

  現在,我們就用test中的一個文件來作測試吧。爲了方便各位的理解,我這裏就直接使用MinGW了,跳過Dev-Cpp的操作,因爲對IDE的操作確實很難說清楚,有時候一大段的內容只說清楚了一個很簡單的內容。
 
  我們從test目錄中將文件 testwin.c sample.bmp複製到你的工作目錄下(我通常會用一個WorkHome來放一些寫的程序,這樣不會東一個西一個了)。
  在編譯前,我們先要對testwin.c做一些小小的修改,用Dev-Cpp打開testwin.c。當然記事本也可以。將開頭那段中,#include "SDL.h" 改成 #include <SDL.h>。然後保存退出(下面我們將不用Dev-Cpp)了。
  然後我們寫一個MakeFile.txt的文件,用來生成SDL程序。

#MakeFile.txt

all:
 gcc -I"(SDL_PATH)/include/SDL" -c testwin.c -o testwin.o
 gcc -L"(SDL_PATH)/lib"  -mwindows -lmingw32 -lSDLmain -lSDL -lSDL.dll -o testwin.exe testwin.o

#MakeFile.txt End

  最後我們使用命令提示符,在 testwin.c sample.bmp MakeFlie.txt 所在的目錄下輸入如下命令(但是首先你的系統必須做第一章那樣的設置)。

make -f makefile.txt

  如果沒有任何問題你就得到了個名爲testwin.exe的程序。

  當然,現在你還不能運行她。因爲你沒有SDL.dll。你現在可以從bin目錄中將SDL.dll複製到testwin.exe所在的目錄中去了。現在可以運行了。當然,在你運行的目錄中會出現兩個文件。stdout.txt和stderr.txt。這兩個是輸出文件。


  你現在可以對test中的一些例子進行編譯了。當然,還是要對源碼做一些小修改。如果你覺得你以後會經常使用她,那麼你就可以將她做成工程文件,便於以後生成。
  好了,直到現在,你對SDL的認識也就成功了三分之二,爲什麼是三分之二呢?因爲還有三分之一的成功路程是你自己在對SDL的瞭解時走出來的。我不喜歡什麼都手把手的教,什麼都手把手的學。只有自己學會了,纔是真正屬於自己的。別人告訴你的那還是別人的。不過我還是很樂意解答你在學習使用中遇到的問題的。

文外音:
其實,我個人還是比較喜歡SDL的。原本想用SDL來做前面對Dev-CPP環境設置的介紹的。不過,後來發現SDL的網站暫時關閉了。所以,不得不用GTK來做介紹。在後面的一文中,我將在次將GTK推上我們的教程中。至於原因,是因爲原來的內容只是爲了介紹如何設置Dev-Cpp才引入的。下一篇,我是要以GTK爲介紹重點。敬請期待。本系列文章還在繼續中(也許要等我退休了才能寫完吧,不知道這個編譯器的公司會不會給我勞務費啊?)。


 STUDIO軟件開發組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)

 Dev-Cpp/Mingw32 環境介紹(11)

上文回顧:

  在上一篇文章中我向各位介紹了有關SDL的安裝和設置。希望各位能夠從中受益,按照上次的所說的。這次我們將要安裝GTK運行與開發庫。當然,這一切都是在Win32下進行的。希望你們能夠愛上這個。

第十六章 GTK的下載和安裝

  GTK?很多人會好奇,既然有了MFC爲什麼還要GTK?其實,MFC並不是跨平臺的GUI。而GTK可以在多平臺上運行。如Linux,Mac。當然,也包括Win32。如果你想讓你的程序在一處編寫,多處編譯的話。GTK是一個非常不錯的GUI。
  GTK在前面已經介紹過如何通過安裝程序來安裝。但是,對於那些比較新的庫,可能你們就無法安裝了。而且,也不夠自由。下面,我就介紹一下如何從GTK官方下載安裝GTK的Win32版本。對於GTK的介紹,我想我不用介紹了吧。

  GTK的官方網站 http://www.gtk.org 找到Win32的下載地址。在上到這個網站的下載頁面後,你會發現很多下載鏈接。這些都是GTK的一部分,你可以按照你的需要來下載相映的數據文件。不過,你必須下載如下幾個文件,這是必須的。

GLib
libiconv
gettext-runtime
GTK+
atk
Pango

  如果你只是運行的話,就只要下載runtime就可以了,如果你要開發的話,那 還 要下載帶有dev的數據文件(注意其中還有一個是源文件)。在這篇文章寫的時候,最新穩定的gtk是2.6版本的。

  在下載完成以後,我們就只要壓縮到一個目錄中就可以了,不過,注意,對於Dev和Runtime要分別壓縮到兩個目錄中,免得混淆。
  在將Dev中的

\include\gtk-2.0
\lib\gtk-2.0\include
\include\atk-1.0
\include\pango-1.0
\include\glib-2.0
\lib\glib-2.0\include

添加爲頭文件路徑

\lib

添加爲庫文件路徑

在鏈接時添加如下參數
-lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv
在編譯時添加如下參數
-mms-bitfields

這樣,我們的GTK 開發庫就算安裝完成了。

不過,運行的的話就有問題了,還要對系統設置一下。

將bin文件夾和lib文件夾的路徑添加入系統Path變量中就可以了。或者,你將lib文件夾內的文件複製到bin文件夾中,只將bin的路徑添加爲系統變量也可以。(後者是官方網站建議的)。

至此我們的GTK開發環境和運行環境都設置好了。下面給出一組簡單的Makefile和例子代碼。

#MakeFile.txt
CC=gcc
GTK_PATH=
CFLAGS=-mms-bitfields -I"$(GTK_PATH)\include\gtk-2.0" -I"$(GTK_PATH)\lib\gtk-2.0\include" -I"$(GTK_PATH)\include\atk-1.0" -I"$(GTK_PATH)\include\pango-1.0" -I"$(GTK_PATH)\include\glib-2.0" -I"$(GTK_PATH)\lib\glib-2.0\include"

LFLAGS=-L"$(GTK_PATH)\lib" lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv

all:
 $(CC) $(CFLAGS) -c gtk.c -o gtk.o
 $(CC) $(LFLAGS) -o gtk.exe gtk.o

#MakeFile.txt End


//gtk.c

#include <gtk/gtk.h>
static void destroy( GtkWidget *widget,  gpointer data )
{
 gtk_main_quit ();
}
int main( int argc,  char *argv[] )
{
 GtkWidget *window;
 gtk_init (&argc, &argv);
 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 gtk_window_set_title(GTK_WINDOW(window),"GTK+ Programe");
 g_signal_connect (G_OBJECT (window), "destroy",
 G_CALLBACK (destroy), NULL);
 gtk_widget_show (window);
 gtk_main ();
 return 0;
}

//gtk.c end

  至此,有關GTK的設置和安裝就到這裏介紹完成了。由於前面對於設置的內容有過詳細的介紹。所以,這裏就不做太深入的操作說明了。如果有不明白的,可以在這裏提出也可以尋找以前的內容。由於本系列文章有很多地方轉載,所以如果您是在轉載的網站上查看。那麼http://blog.csdn.net/visioncat/上能找到,完整的,最新修正後的文章。同時,你也可以在上面相應的文章下,提出您的問題和建議以得到最直接的幫助。

文外音:
在這篇文章以後,MinGW/Dev-C++ 將進入中級篇介紹了。原本那些只對Dev-Cpp的設置和操作的介紹將基本停止(只在必要時說明)。轉而對MinGW和其他GCC的Win32編譯器做更仔細的介紹以供您深入使用。我想您也不想總是停留在某個IDE下使用Dev-Cpp吧。其實,Dev-Cpp中的核心編譯器就是MinGW。所以,您在中級篇中讀到的內容同樣能夠應用到Dev-Cpp中。有些你可以對Dev-Cpp做一些修改便可以成功使用中級篇的內容。不過,我還是會以MakeFile的介紹爲主。就好像我第十五,十六章所展示的一樣。不過,內容會更爲豐富。敬請期待。


STUDIO軟件開發組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)

Dev-Cpp/Mingw32 環境介紹(12)

上文回顧:
在上一篇文章中,我們瞭解瞭如何在MinGW中設置GTK和使用GTK。從這一篇開始,我我們就要開始進入中級篇了。也就是說,我們主要以MinGW和其他GCC在Win32下的使用爲主。而不是如同原來只介紹那些操作IDE,安裝組件等。如果說,以前我們是在跑道上,那麼現在我們就要起飛了。所以,我們會比較注重以MakeFile來說明程序的配置。同時會帶上一些Dev-Cpp的設置。

第十七章 在Win32下安裝GCC的過程

  有很多人會問,我們既然有了Dev-Cpp這樣簡單的安裝工具,爲什麼還要去自己學習如何安裝MinGW等GCC編譯器呢?不是多此一舉麼?要知道,從現在開始,你已經是在讀中級篇的內容了,你也不想只知道通過安裝Dev-Cpp來安裝MinGW吧。既然你已經選擇了GCC,那麼知道如何安裝GCC在Win32下的一些變體也是一箇中級學生該知道的內容。

  MinGW,我想不用介紹了。因爲Dev-Cpp中自帶的就是這個。Cygwin,一個在Win32下模擬Unix中斷的軟件組,其實對於真正的Win32開發來說,Cygwin並不是首選,所以我這裏也就省略了。Djgpp,一個可以在Win32下開發16位程序的軟件,當然也可以讓你的軟件在DOS下運行。通過上面的一些介紹,我想各位一定知道,我們要安裝的編譯器就是,MinGW,Djgpp。

  MinGW的安裝,其實非常簡單。你可以從 http://www.MinGW.org 上下載最新的版本。不過建議你看仔細了,因爲有些還是在測試中的。所要下載的文件如下(默認情況下我所安裝的是C語言,而不包括C++,如果需要,只要下載C++的文件就可以了)。

binutils    其中包括ld,as等編程需要的程序組
gcc-core    C語言編譯器
mingw32-make-3.80.0-3    Make程序
mingw-runtime    其中包括編譯程序的大部分頭文件和庫文件(不包括Win32API)
w32api    這個裏面是Win32 API 的頭文件和庫文件

如果,你需要其他的比如Java,C++,Ada你都可以從上面的網址中下載到。Good Luck。

下載後,全部解壓縮到一個目錄中,比如 MinGW目錄中。如果存在重名現象,通常都是 許可證等的文件,可以履帶掉或者不復制。
因爲,這些程序包都是使用GNU的壓縮工具生成的,所以。文件名不是zip。你可以用WinRAR來開。或者使用 GNUWin32 的工具來解壓縮。
http://www.gnuwin32.org
下載tar程序。
如果你下載的文件是 *.tar.gz那麼下載 gzip
如果你下載的文件是 *.tar.bz2那麼下載 bz2程序(不推薦這個)

然後,使用命令
gunzip (文件名.tar.gz)
tar -xvf (文件名.tar)

就可以解開了。

其實,這些工具的安裝都是非常簡單的。我個人比較喜歡那些直接解壓縮的工具。這樣的話,不會生成什麼其他的垃圾文件。


  Djgpp,這個可能對各位比較陌生。這個是在DOS下的GCC。你沒有看錯。這的確是在DOS下的GCC。你可以在MS-DOS的啓動盤上運行Djgpp的程序。你也可以在FreeDOS上的啓動盤上做這些。這的確是真的。說起來,Djgpp的安裝會比較麻煩。
http://www.delorie.com/djgpp/ 上你可以下載到你所要的文件,這個是Djgpp的官方網站。
在下載的頁面上有一個爲用你給的參數來爲你選擇下載文件的頁面。你可以更具自己的要求來選擇。
我這裏,下載的是(時間比較久了,肯能已經很老了)
bnu216b.zip
djdev203.zip
gcc400b.zip
gdb611b.zip
mak3791b.zip
txi48b.zip

將這些文件全部解壓縮到一個目錄中。然後,爲系統設置變量。

DJGPP=(Djgpp的安裝路徑)/djgpp.env

這樣就算安裝好了。因爲,是在中級篇了。所以,很多東西不會像以前那樣一步步的教了。

 Cygwin,雖然前面說不想介紹。但這裏還是介紹一下吧。
可以先從Cygwin的官方網站下載setup.exe這個安裝程序只是一個網絡安裝版本。很多東西還是要你從網上下載的。你可以使用他直接從網上下載。也可以自己下載。下面,我介紹一下我的安裝方式。
http://mirrors.kernel.org/sources.redhat.com/cygwin/release/
從上面的地址中,獲得setup.ini這個配置文件。從而獲得依賴性。
下面我從中抽取一段來解釋一下。

@ gcc
sdesc: "C compiler upgrade helper"
category: Devel
requires: cygwin ash binutils w32api mingw-runtime libintl3 gcc-core gcc-g++ gcc-mingw-core gcc-mingw-g++
version: 3.4.4-1
install: release/gcc/gcc-3.4.4-1.tar.bz2 46 c616cffee0f344c37fd4e045a7a87054
source: release/gcc/gcc-3.4.4-1-src.tar.bz2 46 c616cffee0f344c37fd4e045a7a87054
[prev]
version: 3.3.3-3
install: release/gcc/gcc-3.3.3-3.tar.bz2 46 c616cffee0f344c37fd4e045a7a87054
source: release/gcc/gcc-3.3.3-3-src.tar.bz2 46 c616cffee0f344c37fd4e045a7a87054

@ gcc是包名。比如這裏就是GCC工具。
requires: 是依賴的包,比如 cygwin 你可以通過搜索 @ cygwin 在這個文件裏找到這個包的信息。
install:  是安裝的文件位置。
source: 就是這個程序的源文件地址(通常我們不下載)。

按照這種方式你就可以然後,你把這些文件按照網站上的目錄結構保存好。然後運行setup.exe 使用本地安裝就可以了。

問外音:
我不喜歡Cygwin,因爲覺得這個東西總喜歡在註冊表裏做一些修改。
其實,真正深入GCC的編程就會發現,不論是MinGW還是Cygwin或者是Djgpp都是不完全的。所以,近期我準備安裝一個FreeBSD玩玩。可能以後就會徹底放棄了這個Windows了。
下一篇文章,我將繼續深入介紹 GCC for Win32 環境的內容。對於你們深入瞭解GCC有很大的幫助。其實,很多人都對GCC有誤解,總以爲MS-C++如何好。其實,GCC也並不比MS-C++差啊。畢竟GCC是Linux下的一個優秀開發環境,Linux內核等都是用GCC編譯出來的。MS-C++能編譯出Win32內核麼?對了,Win32的內核源文件根本沒有,又哪來的編譯一說?


 STUDIO軟件開發組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)


Dev-Cpp/Mingw32 環境介紹(13)


上文回顧:

在上一文中,我們瞭解瞭如何在Win32下安裝GCC的移植版本。那麼,從這一章開始。我們將深入GCC的編程世界。不過,有一點我想說明,那就是:當你越深入GCC,你就覺得Win32下的GCC越不夠用。所以,Win32下的GCC作爲一個開發應用程序的編譯器,那當然是足夠了。問題是,如果你要將GCC的潛力全部開發出來。那麼你就必須在Unix或者類Unix系統上使用。如FreeBSD就是不錯的選擇。我最近也要遷移到這個系統下了。


第十八章 GCC下的彙編應用


這一章中,我將向各位展示GCC下的彙編語言。如果,你是計算機科班出身。那麼,請你注意了。你不要以爲這裏的彙編語言你學過。因爲,GCC所使用的彙編風格和在高校中學的有很大的出入。一不小心就會出錯。


在開始之前,我先介紹一下彙編的風格問題。彙編語言的風格基本分爲兩種。第一種是Inter彙編語言風格。第二種是AT&T彙編語言風格。前者,是現在國內高校學習的。後者,是GCC所使用的。相對來說,我個人偏好AT&T,因爲不會造成不好的編程習慣,而且Linux內核中的彙編部分也是用這種風格寫的。

彙編語言的風格,只是一種格式,對執行沒有任何的影響。所以,不論你學的是Inter彙編風格,還是AT&T除了編寫部分有不同外。其他的知識都是一樣的。


AT&T彙編語言風格,與Inter的風格最大的差異是,他們的操作數是相反的。比如,


//AT&T

movb $0x01,%al

movw $0x0023,%ax

這裏,我們可以看到。立即數前是 $ 寄存器前是 % 。還有,操作順序是相反的。這就是AT&T的特點。有關AT&T更多的內容。請到網上查詢一下。


下面開始正題。在GCC下使用匯編。因爲,我們在中級篇開始,就介紹了許多GCC移植版本的安裝。而且,他們的適用範圍也不同。所以,在沒有特殊的提示前。我們都使用MinGW


//myas.s

.text

.global _myas

_myas:

pushl %ebp

movl %esp,%ebp


movw $0x0001,%ax


popl %ebp

ret

上面是一段彙編代碼,在GCC中,彙編代碼通常都是以 s 爲後綴名的。這段代碼只是返回一個1,不接受任何參數。

.global _myas 這是定義 _myas 這個函數名。

其他的,我想就不用介紹了。除了操作數順序不同。其他的和Inter一樣。


//main.c

#include <stdio.h>

#include <stdlib.h>

int myas(void);

int main(int argc, char *argv[])

{

int r;

r=myas();

printf(“%d”,r);

return(0);

}

上面那段代碼,就是把myas的參數打印到終端上。是不是很簡單?下面我們看看如何在Win32下將這些文件編譯出來。

>gcc -c myas.s -o myas.o

>gcc -c main.c -o main.o

>gcc -o main.exe main.o myas.o

這樣,我們的代碼就算鏈接成功了。運行一下看看吧。

以上,是在C代碼外,使用匯編。在C代碼內使用的彙編的方式和平時VC的方式是一樣的。使用,

__asm__(“movw $0x0000,%ax\n\t”);

就可以在C語言中嵌入彙編代碼了。方便好用嘛。

如何?這樣的話,就可以讓你的代碼運行效率得到很大的提升了。


文外音:

是不是這次的文章好像在結構上好看很多?因爲,我原來都是使用寫字板編寫的。這次使用的是,OpenOffice這個軟件。只要將他生成的HTML代碼貼到Blog上,就可以了。很方便的。而且,是免費的工具哦。我用的是英文版的,覺得很用着很舒服。

看了中級篇的內容,是否覺得自己有很多不足呢?的確,我們學的東西還很多。不過,當你真正的用GCC時,你就會覺得這些在Win32下的東西有些不夠用了。中級篇的內容,將不再是以前那樣重點寫安裝和使用了。而是把重點放在更深一層的應用方面。如果,你覺得在看本文時有什麼疑惑,或者想法。可以到我的Blog上發表。

如果,您好轉載我的文章。請在文章出處寫明,我的Blog地址,以便有疑惑的兄弟們能夠及時的提出問題,並得到回答。謝謝。

Blog地址:http://blog.csdn.net/visioncat/




STUDIO軟件開發組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)


Dev-Cpp/Mingw32 環境介紹(14)


上文回顧:

在上一文中,我們瞭解瞭如何在GCC下使用彙編語言。後來,由於個人生活環境的原因所以遲遲沒有發佈新的內容。當然,我這裏並不想說一些不愉快的事情。不過,我沒有想到居然中國還會有那麼沒有道德的人存在。由於,我同宿舍的一個溫州人,邀請N個同學通宵看電影,影響我睡眠,造成我睡眠嚴重不足。更可惡的是對我進行人權侵犯!所以,就沒有時間靜下心來寫東西了。今天剛讓事情平息了一些,就想到了我的朋友你,所以馬上就獻上最新的文章。

第十九章 GCC下編寫Python擴展

在這一章中,我向大家介紹一些有關Python語言的擴展編寫的基礎知識。

如果,你對Python瞭解了。那麼你可以跳過這段,閱讀後面的內容。如果不是,那麼還是請您耐心瞭解一下Python吧。Python是一種解釋性語言,而且歷史悠久。他是跨平臺,面向對象,使用C編寫,可擴展的。他從設計一開始就是爲面向對象設計的。所以,可以說,Python是一種不錯的語言。有關Python的更多內容介紹,你可以看看我曾經寫的另一篇Python的文章《略談Python語言》。


Python可以使用C這一可移植的語言來進行擴展。而且,由於是用C寫的。所以,擴展的速度可以和靜態語言相比。所以,可以說會寫Python的擴展可以大大的提高項目的運行效率。當然還有其他的好處。


不過,本文並不是介紹Python的語言的,也不是專門介紹用C擴展Python的。所以,就像我曾經所說的,我本系列的文章只是爲你開啓一扇扇的門。


下面我就開始我的的主題了。


在開始一切之前,請您先到 http://www.python.org 上下載最新的解釋器,並安裝。在我寫本文的時候,最新的版本是Python 2.4.2 。這裏有關Python的安裝,我就不一步步的詳細介紹了。


開始寫程序吧!


首先,我先給出一組簡單的Python代碼吧。

第一個文件爲add.py文件,這個文件將是會被導入的。

add.py

def add(x,y):

return(x+y)


第二個文件爲main.py文件,這個文件將是會被執行的。

#main.py

import add

print add.add(256,512)


請將上面兩個代碼使用指定文件名(大小寫也要注意,雖然在Win32下是不分大小寫的)寫入同一個目錄下。然後,使用DOS終端在那個目錄下輸入 main.py 你將會看到他的輸出爲 768


下面我簡單介紹一下兩個代碼的意思。

第一個文件中,定義了一個add函數,傳入兩個參數,分別命名爲xy。函數的作用是返回x+y的數值。

第二個文件中,我們首先導入了add.py這個文件,並把他的名字空間放到add空間中。然後,我們調用add中的add函數,並傳入256512。而且,最後在終端上顯示add函數的返回值。


也許你會問,這不是介紹C的麼?怎麼又介紹Python了。其實,這個是爲後面打下基礎。


接着,我們試試用CPython中實現add.py的功能吧。

//add.c

#include <Python.h>


static PyObject* add(PyObject *self, PyObject *args);


static PyObject* add(PyObject* self, PyObject* args)

{

int x=0 ;

int y=0;

int z=0;

if (! PyArg_ParseTuple(args, "i|i", &x, &y))

{

return NULL;

}


z=x+y;

return Py_BuildValue("i", z);

}


static PyMethodDef addMethods[] =

{

{"add", add, METH_VARARGS, "Execute a shell command."},

{NULL, NULL, 0, NULL}

};


PyMODINIT_FUNC initadd()

{

Py_InitModule("add", addMethods);

}


這段代碼也許你會覺得有些糊塗,這是什麼東西?下面我爲你一一介紹。

首先的#include <python.h>是必須被導入的。這個在Python的安裝目錄的include目錄中有。其次,我們定義了一個函數叫add。由於Python中的所有東西都是對象。所以,這裏在C中,爲了於Python通訊,C傳給Python的,Python傳給C的都是PyObject這個數據類型。下面PyArg_ParseTuple這一句,是將傳入的數據轉換成C類型的。Py_BuildValue這個函數是將C數據類型轉化成Python的數據類型,並返回他。

接着,我們要告訴Python,我們C中的Python的函數有那些。所以,addMethods這個數據組,就是爲了存放這些數據的。這個就是一個列表。最後那個initadd這個函數是在Python導入模塊時初始化用的。必須存在。而且,比如以 init模塊名的形式在命名。其中Py_InitModule函數,是告訴PythonaddMethods這個列表所定義的內容,加入add這個名字空間中。

最後,我把代碼在書寫一遍。不過這次,我會用紅色的部分標出套路的代碼部分,也就是必須需要的地方。

#include <Python.h>


static PyObject* add(PyObject *self, PyObject *args);


static PyObject* add(PyObject* self, PyObject* args)

{

int x=0 ;

int y=0;

int z=0;

if (! PyArg_ParseTuple(args, "i|i", &x, &y))

{

return NULL;

}


z=x+y;

return Py_BuildValue("i", z);

}


static PyMethodDef addMethods[] =

{

{"add", add, METH_VARARGS, "Execute a shell command."},

{NULL, NULL, 0, NULL}

};


PyMODINIT_FUNC initadd()

{

Py_InitModule("add", addMethods);

}


最後,我們來把這個代碼編譯一下吧。你也許會問,既然是跨平臺的,是否對於不同的操作系統,要使用不同的編譯方式。答案是否定的。Python自帶的編譯腳本可以爲你完成一切的編譯過程。不過,你要在開始要把你的MinGW設置進環境變量中。具體可以看本系列文章第一章到第三章。

下面給出Python編譯安裝腳本的文件。

#!/usr/bin/python

#setup.py


from distutils.core import setup, Extension


module1 = Extension(name='add, sources = ['add.c'])


setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1])

這段代碼是告訴Python如何來組成你的包。首先,第一句#!/usr/bin/python 是在BSD/Linux/Unix下告訴系統使用什麼解釋器運行代碼在Win32下有和沒有沒什麼區別。

Module1=Extension('mytest',sources=['add.c']是定義你第一個要編譯擴展的信息。後面的setup函數,就是用來定義包的,其中在ext_modules中就在列表中加入了我們剛纔定義的模塊信息。這樣,Python會更具你給的信息,更具不同的平臺,操作系統自動的編譯出合適的擴展文件。


dos終端下輸入setup.py build -cmingw32 如果沒有錯誤,那麼在編譯後,你會在build目錄中的子目錄中找到add.pyd這個文件,這個就是PythonC擴展文件。把第一個例子中的add.py從目錄中移除,並刪除add.pyc這個文件(這個文件會在Python導入時自動生成,方便下次導入時快速執行和導入)。再將剛纔編譯的add.pyd放到該目錄下。像剛纔一樣的運行,你看到了什麼?和剛纔一樣的運行結果。對的。我這裏的C擴展就是實現了剛纔Python所定義的功能。怎麼樣是不是覺得還有很多不明白?如果你要深入Python的擴展編程,你可以看看Python的參考手冊 Python/C API 這部分內容。下面列出一些Extension中一些參數的意義。


include_dirs 定義頭文件的目錄地址,默認情況下Python頭文件目錄的地址已經被定義了。

library_dirs 定義了庫文件的目錄地址,默認情況下Python的庫文件目錄也被包含了。

Libraries 定義在編譯時要使用的庫文件名,這個有點像GCC中在-l後面加的參數。


當然,還有其他很多參數。這裏只是列出了常用的幾個基本參數名和意義。希望我爲你開啓的門夠寬敞。如果有興趣,可以查看Python的參考手冊。相信對你一定有很大的幫助。

好了,最後祝你在學習的過程中一切順利,Good Luck。並且,希望有什麼問題請你儘量提出來。


文外音:

就像我開始所說的,我由於生活環境的因素造成我遲遲沒有寫新的文章。這一點,是讓我剛到非常虧欠於你的。不過,這也是最近一個月沒有出文章的原因。前一階段我也說過了,沒有創意了。後來,偶然之間找到了中級篇的指導方向,所以馬上就有了新文章的構思。希望我這篇文章能夠讓你們滿意。謝謝你長久以來對我的支持。因爲有了你,我纔會有不懈的動力寫下去。謝謝。如果你有任何的問題請到 http://blog.csdn.net/visioncat/ 上提出你的問題和建議。


STUDIO軟件開發組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章