GCC for Win32開發環境介紹


GCC for Win32開發環境介紹(1)


第一章 在視窗操作系統下的GCC

第一節GCC家族概覽


GCC是一個原本用于Unix-like系統下編程的編譯器。不過,現在GCC也有了許多Win32下的移植版本。所以,也許對于許多Windows開發者來說,GCC還是一個比較陌生的東西。所以,我希望通過這章的敘述,讓你——一個Windows開發者對GCC這一個優秀的編譯器有一個大概的了解。


歷史

GCCGNU公社的一個項目。是一個用于編程開發的自由編譯器。最初,GCC只是一個C語言編譯器,他是GNU C Compiler 的英文縮寫。隨著眾多自由開發者的加入和GCC自身的發展,如今的GCC以經是一個包含眾多語言的編譯器了。其中包括C,C++,Ada,Object CJava等。所以,GCC也由原來的GNU C Compiler變為GNU Compiler Collection。也就是GNU編譯器家族 的意思。當然,如今的GCC借助于他的特性,具有了交叉編譯器的功能,即在一個平臺下編譯另一個平臺的代碼。

直到現在,GCC的歷史仍然在繼續,他的傳奇仍然被人所傳頌。


Windows下的GCC家族


起初,GCC是用于Unix,Unix-like系統的編譯器。不過,現在Windows下也出現了GCC的穩定移植版。這要感謝Internet上眾多程序員的共同努力。

如今,在Windows下比較流行的GCC移植版主要有三個。他們是MinGW,CygwinDjgpp。雖然,Djgpp是應用于DOS系統的,考慮到windowsDOS的兼容,所以也將Djgpp納入其中了。

總體來說,MinGWCygwinDjgpp各有特色,針對不同的應用場合,可以選擇不同的移植版來滿足需要。MinGW這個系列的移植,主要方向是讓GCCWindows移植版能使用Win32API來編程。而Cygwin的目標是能讓Unix-like下的程序代碼在Windows下直接被編譯。至于Djgpp,則是想讓DOS下也能用上GCC
所以,對于開發人員不同的需求。選擇合適的移植版會讓工作變得輕松而高效。


本書的GCC


我個人對GCC的移植版都非常喜歡。不論是MinGW還是Cygwin,亦或是Djgpp。在本書中,除了特殊說明以外,所述的內容適合所有這三種移植版。
不過,考慮到現在在Windows下用的比較多的是MinGW系列。再加上MinGWCygwinDjgpp安裝和使用更為簡便。所以,建議讀者學習時還是使用MinGW



第二節 入鄉隨俗的MinGW


簡介

MinGWMinimalistic GNU for Windows的縮寫。她是一個建立在GCCbinutils項目上的編譯器系統。和其他GCC的移植版相比,她可以說是最接近Win32的一個了。因為,MinGW幾乎支持所有的Win32API,這也是MinGW的特色之一。她所連接的程序,不需要任何第三方庫就可以運行了。在某種程度上看,MinGW更像是VC的替代品。


獲得與安裝

MinGW可以從MinGW的官方網站http://www.mingw.org上獲得。

如果,你要安裝MinGW,那么你有兩種安裝方案。下面我來一一介紹。


安裝方案一:

首先,你要從http://www.mingw.org/download.shtml上下載如下幾個壓縮包。考慮到文件的更新和文章的靈活性。我將只寫出文件的主要部分,將省去版本好和更新日期。


gcc-core
C語言編譯器
gcc-c++
C++語言編譯器
mingw-runtime
MinGW的運行時庫(這個必須安裝)

win32api

win32API函數頭文件和連接庫

binutils

MinGW的匯編器和連接器等基礎工具

gdb

MinGW中的調試工具
mingw32-make
Make工具,用以更好的管理你的項目


然后,將上述文件逐一下載,然后全部解壓縮到一個目錄下就可以了,我這里假設你是移動到$(MINGW)這個目錄下了。這樣,你的MinGW就算安裝成功了。

最后到DOS終端上,將當前目錄轉換成$(MINGW)/bin 下。輸入


C:/>gcc -v


看到一段gcc的版本信息,這就能說明,你的gcc已經可以正常工作了。


安裝方案二:

你可以從http://www.mingw.org/download.shtml上下載 MinGW5.0.2.exe這個程序。至少,在我寫此文的時候,這個是最新版本。

下載以后運行安裝,至于安裝過程,我想我就不一一介紹了。對于Windows下的開發人員,我想這個應該不是什么問題了。
在一切都選擇好以后。這個程序就開始從Internet上下載所需要的壓縮包。然后,逐一解開,安裝。


總體來說,兩種方法各有長處。不過,本人偏愛第一中方法。因為,控制度高,而且,更新也比較簡單。自己心里也比較明了。


環境設置:


對于我們這些使用者來說,最好是能夠簡單方便的使用工具。所以,我們就需要設置環境,便于我們使用MinGW

對于設置,我們只需要在環境變量中的PATH變量中,添加$(MINGW)/bin這個路徑就可以了。


這樣,你就可以在任何目錄下使用MinGW了。



第三節 人在曹營心在漢的Cygwin


介紹


Cygwin,其實并不是一個GCC。她是讓Windows擁有Unix-like環境的軟件。所以,GCC自然也就會包含在里面。不過,對于開發者,Cygwin是一個開發環境。而對于用戶來說Cygwin是一個運行環境。
Cygwin唯一和MinGW最大的區別在于,使用Cygwin可以在Windows下調用Unix-like的系統函數。比如進程函數,等等。所以,雖然說,Cygwin是運行在Windows下的,但是她還是使用的是Unix-like系統的函數和思想。


獲得與安裝

Cygwin可以從Cygwin的官方網站獲得安裝程序http://www.cygwin.com/

在網站上下載Cygwin的安裝程序setup.exe。然后運行便可以了。
關于前面的設置,我想不用多做介紹了。因為,對于這些我想Windows下的開發人員應該相當清楚了。

在到了選擇安裝的組件時,在Devel選項下,將gcc-core,gcc-g++等前的skip點擊成你所需要的版本號。

然后在Lib選項卡中,將glib2,glib2-devel,glib2-runtime前的skip點成版本號。

接下來,就點擊next就可以了。在一段漫長的等待時間后,你的Cygwin開發環境就算安裝好了。
相對來說,Cygwin的安裝和配置都比較簡單。因為,Cygwin提供了一個比較健全的安裝程序。


使用


在安裝目錄下,運行cygwin.bat就可以啟動cygwin環境了。這是一個模擬Linux的環境,所以很多地方可能和Dos有比較大的差距。不過,你編譯出的程序可以直接在其他沒有安裝Cygwin的機器上運行。還有,如果要切換到windows下的其他盤下,比如D盤。那么就可以使用


$cd /cygdrive/d/


對于Cygwin更多關于使用的內容,你可以到Linux社區去獲得參考。


第四節 腳踏兩只船的Djgpp

介紹


Djgpp,是一個在純Dos下的GCC移植版本。她使用一些軟件將純Dos設置成32位的環境,并運行由她編譯出來的程序。總體來說,Djgpp并不是一個Windows的移植版。不過,她確實可以在Windows下運行。對于一些特殊應用。Djgpp是唯一適合的。


獲得與安裝

Djgpp,可以從Djgpp的官方網站上下載http://www.delorie.com/djgpp/

不過,這里Djgpp為用戶做了更好多的安排。她為用戶提供了一個定制安裝的頁面。
http://www.delorie.com/djgpp/zip-picker.html
您只需要在上面填寫響應的內容,然后遞交。她將會給你一份完整的安裝方案。


使用


相對來說,Djgpp我并不是經常使用。所以,本文中在沒有特殊說明情況下,不會使用Djgpp的。



文外音:

總體來說,這篇文章寫的有些匆忙。所以可能有些地方有不足。所以,希望各位能夠多多原諒批評和指教。下一章,我將介紹GCC for Win32IDE。同時,從這一章開始,我將向各位讀者做一個小小的要求。那就是,希望你們能夠將自己對這篇文章感到的不足告訴我,我將隨時修改以發表的內容,以適合廣大讀者的要求。如果各位有什么想法或者意見,疑惑。希望您能到http://blog.csdn.net/visioncat上提出。




上文回顧:

在上文中,我們了解的windows下的GCC編譯器。這一章我們將來看IDE的介紹了。在此,我還要為各位表示抱歉,因為那么久才寫出這篇文章。


GCC for Win32開發環境介紹(2)


第二章GCC的外衣——IDE環境


第一節IDE for GCC概覽


IDE,即Integrated development environment,也就是綜合開發環境。對于習慣使用VCwindows程序員來說,在windows下,GCCIDE也許就比較陌生了。所以,想通過這一章簡單介紹一下GCC所使用IDE

GCCIDE是什么?

IDE,也就是 綜合開發環境 。她是為了便于程序員開發,管理項目的軟件。對于C/C++來說,她主要包括四個部分。代碼編輯器,編譯連接器,調試器和工具庫。而GCC本身就包含了編譯連接器,調試器和工具庫。所以,嚴格的說,GCCIDE主要功能就是一個代碼編輯器,是用于編寫代碼的軟件。

所以,從上面我們可以看到一個問題,那就是支持工具庫的不是IDE,而是編譯器。如果你使用不同的IDE開發項目,只要你使用的編譯器是相同的,那么她就能支持相同的工具庫。

Windows下的為GCC設計的IDE有那些?

許多GCCIDE,畢竟不是商業化制作的,因此很多地方都有不足的地方。下面是我個人認為不錯的幾個IDE

Dev-C++,這個IDE可謂是專門為GCC所設計的IDEVisual-MinGW,一個模仿VC6.0界面的IDE。最后是最近最火的Code::Blocks,由于也是最近接觸,所以也不是太了解,不過,給人的第一印象是,特別像VC.Net的界面。

總體來說,各個IDE都有其自身的特點。對于初學者,Dev-C++比較不錯,因為各種工具庫基本都有為Dev-C++設計的安裝包。對于從VC轉形到GCC的人來說,Visual-MinGW是一個不錯的選擇,因為據我所知,大家熟悉和喜愛的還是VC6.0居多,因此模仿VCVisual-MinGW是一個不錯的選擇。對于打算用GCC開發項目的人來說,Code::Blocks的確會成為你的最愛,因為她的項目管理實在是太優秀了。其實,每個人都會從中找到適合自己的IDE

本書的IDE

本書使用哪種IDE呢?其實,本書不是專門為哪種IDE所寫的。因此,本書所寫的都是針對GCC本身所寫的。因此,本書中的IDE。其實就是windows下最不起眼的notepad。不過,為了書寫便捷,我通常使用Emacs或者Notepad++來書寫代碼。Emacs是一個Unix環境下優秀的編輯軟件,Notepad++是一個notepad增強版,個人感覺比較適合開發程序。本書會在每個例子程序后附帶一個Makefile文件,通過這個文件各位就能夠非常直接的了解到環境的配置方式,然后根據不同的IDE為你的程序添加不同的參數。


第二節 最專一的Dev-C++


簡介

Dev-C++,全稱Bloodshed Dev-C++,是由Bloodshed公司開發的一款C/C++IDE。她所默認的編譯器為MinGW,但是她能夠支持Cygwin等其他任何GCC的移植版以及GCC本身。她是使用Delphi開發的,因此有些C/C++開發者覺得她的血統不純。但是我個人認為,只要適合的,我們又何必在意她用什么開發呢?

獲得與安裝

Dev-C++,可以從她的官方網站http://www.bloodshed.net上獲得。在官方網站的下載頁上,你將會看到三個安裝程序。下面我一一解釋一下。

Dev-C++ with Mingw/GCC這個是包含MinGW的安裝包。安裝這個包以后,你將擁有完整的一個IDE開發環境,自然包括編譯器等。

Dev-C++ executable only這個是只有IDE的安裝程序,其中不包括任何編譯器。所有,如果你沒有安裝GCC編譯器的話,安裝這個包以后你將會出現無法編譯項目的問題。

Dev-C++ source code這個是源代碼包,當然其中只有Dev-C++的代碼,沒有任何GCC的代碼。

通常偷懶的人選擇Dev-C++ with MinGW/GCC這個包,這個也是我建議初學者安裝的包。如果,你在上一章以后,已經安裝了某個GCCwindows移植版,那么你可以選擇Dev-C++ executable only這個包。如果你想研究一下Dev-C++的代碼,并且對Delphi有所了解,那么Dev-C++ source code是你唯一的選擇。

下面我對Dev-C++ executable only的安裝方式進行說明。而Dev-C++ with MinGW/GCC的安裝和她差不多,只是可以省去后面配置編譯器的問題。

安裝

首先,從官方網站下載Dev-C++。運行安裝程序以后,您將看到如下的提示。

這個是讓你選擇安裝時候所使用的語言這里,我們只能選擇English,因為沒有中文安裝界面。

這個是許可證界面,選擇I Agree。感覺現在大家用盜版用多了,對于許可證都不關心了,可是我想作為一名開發者,應該對許可證的內容重視一下,畢竟你的軟件也是要被人使用的。

這個是安裝選項界面。其中,你可以選擇你所要安裝的內容和安裝的一些選項,比如是否關聯文件等。如果你下載的是Dev-C++ executable only,那么你將無法使用Mingw compiler system(binaries,headers and libraries)這個選項,因為這個安裝文件中沒有包含這個。

這個界面是讓你選擇安裝路徑。你可以在這里選擇你安裝Dev-C++的路徑。我這里假設你安裝在$(DEV)下。

這個界面是詢問你是否為windows上的所有用戶安裝Dev-C++。這里,我選擇 否。如果你想讓本地機上,每個用戶都可以使用Dev-C++,那么你可以選擇 是。

在安裝程序結束后,默認會運行Dev-C++。你在首次運行時,會看到如下界面。

這個是選擇你Dev-C++所使用的語言,界面圖標和窗口風格。如圖上選擇,我們使用的語言是中文,使用New Look圖標,并使用XP風格的窗口。

這個是詢問你是否要Dev-C++提供函數補全功能,她將從頭文件中讀取函數頭,然后為你補全。但是要消耗一定的CPU時間。如果,你的機器還可以的話,并且需要此功能那么你可以嘗試一下。

至此,我們的Dev-C++算是安裝成功了。如果,下載的是Dev-C++ with MinGW/GCC,那么后面的內容你可以不關心了。因為,你的IDE環境已經全都配好了。如果不是,那么您還需要自己安裝編譯器。

配置編譯器

按照我第一章所介紹的,安裝好某一個GCC移植版編譯器,可以是MinGW,也可以是Cygwin。假設,您安裝的目錄為$(GCC),那么請將如下路徑添加到系統變量PATH后。

$(GCC)/bin;

這樣,你的Dev-C++就擁有了編譯器了。當然,你也可以從Dev-C++的網站上下載MinGW全套的Dev包,然后用Dev-C++帶的包管理程序安裝MinGW


添加新的工程類型

在平時,我們通常會建立自己的工程文件。但是,如果每次都要自己設置環境變量,編譯器參數未免也太麻煩了。本處就要介紹,如何將自己定義的工程類型,添加到Dev-C++的新建工程選項里。就如下圖所示,

Dev-C++的項目模板文件,保存在安裝目錄的Templates目錄下。文件以template后綴結尾,你可以用記事本打開。下面我們一起來建立一個自己的項目。

templates目錄下新建一個名為MyProject.template的文本文檔。內容如下:

[Template]

ver=1

Name=MyProject

Icon=0

Description=一個小小的測試

Catagory=HOME


[Unit0]

CName=main.c

C=MyProjectC.txt


[Unit1]

CName=myProject.h

C=MyProjectH.txt


[Project]

UnitCount=2

Type=1

IsCpp=0

Compiler=-DPASSWORD

Linker=-O2

Name=My Project

ProjectIon=0

[Template]

標簽后的內容是對項目的介紹。

Ver

變量是Template文件的版本,這邊默認是1不要更改。

Name

變量是項目的名稱

Icon

變量是項目圖標的路徑,如果沒有那么就寫0

Description

變量是對這個模板的介紹。

Category

變量是這個項目屬于哪種項目,這里我們自己建立了一個名為Home的類型。

[Unitx]

其中x為從0開始的任何整數,是定義項目中所包含的文件。

CName

變量是說明這個文件在項目保存時默認的文件名。(C語言時使用)

C

變量是Cname文件的源文件。(C語言時使用)

CppName

變量同Cname變量,只是在C++語言時使用。

Cpp

變量同C變量,是在C++語言時使用的。

[Project]

標簽是對工程的總體介紹

UnitCount

變量是說明整個項目有多少文件,從1開始。

Type

變量是告訴IDE這個項目采用何種編譯方式。0windows窗口程序,1為控制臺程序,2為靜態連接庫,3為動態連接庫。

IsCpp

變量是說當前項目是否只能使用C++語言,0表示不是,1表示是。

Compiler

變量是編譯器參數

Linker

變量是連接器參數

Name

變量是項目的名稱

ProjectIcon

變量是項目編譯以后,主程序的圖標文件。

下面給出了MyProjectC.txtMyProjectH.txt的內容。

//MyProjectC.txt

#include <stdio.h>

#include <stdlib.h>

#include "myProject.h"

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

printf("%s/n",S);

return(0);

}



//MyProjectH.txt

#ifdef PASSWORD

#define S "Hello World"

#else

#define S "NO PASSWORD"

#endif

重新啟動Dev-C++,在你的項目中就存在了我們的項目。

最后的內容

相對來說Dev-C++的功能還是比較簡單的。而且,界面也是屬于中文的。所以,慢慢摸索你一定可以熟悉這個環境的。

文外音:

總的來說,Dev-C++是一個不錯的IDE。很適合對GCC不是太了解的人使用。當然,這里我還是要表示抱歉,因為最近要忙于考試,所以遲遲沒有推出這篇文章。現在經歷了漫長的考試時間,我在放假的剛開始,就匆匆寫出了一些,趕緊貼出來。這里我還是希望各位能提出一件和疑問。如果各位有什么想法或者意見,疑惑。希望您能到http://blog.csdn.net/visioncat上提出。謝謝。


上文回顧:

在上一篇文章中,我們了解的IDEDev-C++。這篇文章中,我將帶領各位繼續我們的IDE之旅。繼續介紹Visual-MinGWCode::Blocks。希望這些IDE能給各位在工作和學習中帶來便利。



GCC for Win32開發環境介紹(3)


(第二章GCC的外衣——IDE環境)


第三節 最臉熟的Visual-MinGW



簡介


Visual-MinGW是一個專門為MinGW所設計的IDE。如果,你曾經用過VC++ 6.0這個IDE,你的第一感覺就是,Visual-MinGWVC++ 6.0非常相似。所以,對于曾經用慣VC的朋友們來說,Visual-MinGW不失是一個好的選擇。然而,Visual-MinGW的開發與更新似乎并不積極。因此,還有不足的地方。Visual-MinGW的理念是提供一個高效的,快速的創建代碼的IDE


獲得與安裝


Visual-MinGW可以從他的官方網站http://visual-mingw.sourceforge.net獲得。在官方網站上,您將看到有DevelopmentVisual-MinGW兩個下載選項。這里,我只以Visaul-MinGW的下載項為例。Visual-MinGW是一個不包含MinGW編譯器的安裝程序。


安裝


首先,從官方網站下載前面所說的安裝程序,然后運行。基本的安裝步驟和Dev-C++類似。由于沒有什么選項。我們這里就不一一舉例了。

接著,我們運行Visual-MinGW。在第一次運行時,我們將看到如下對話框。

這是詢問你,是否關聯相關文件。也就是讓Visual-MinGW成為默認的文件編輯器。

這個對話框是告訴你,需要將MinGW的目錄設置進你的Compiler目錄。

如果,你安裝了MinGW。那么你在這里就可以設置了。我假設,你的MinGW安裝在$(MinGW)目錄下。那么在Compiler Path前打勾,并將$(MinGW)添加上去。

如此,你的Visual-MinGW就算設置好了。如果,你沒有安裝MinGW,那么你可以查看第一章的內容。這里,我就不多做介紹了。


配置


如果,你需要改變編譯器所在的目錄。可以使用如下方法調用設置界面。

在菜單欄選擇File -> Preferences.. -> Environment這樣,你就開啟了設置界面。這里的設置,和第一次運行的設置一樣。


使用


其實,Visual-MinGW的使用方式和VC非常類似。基本熟悉VC的朋友。一定對Visual-MinGW不會陌生的。所以,在這里我就不詳細介紹了。不過,可惜的是,Visual-MinGW似乎不能添加自己的項目類型。所以,這也給我們帶來了不少不便。





第四節 最新穎的Code::Blocks



簡介


Code::Blocks不只是GCC的一個IDE,也可以支持其他的編譯器,比如MS-VC,Borland C++等等。所以,總體來說Code::Blocks并不是某個編譯器的特屬IDECode::Blocks的界面設計很像VC.net的界面。從效果上看的確不錯。而且,這個IDE支持插件功能,你可以從他的官方網站上獲得這個IDE的插件和相關的幫助。


獲得與安裝


Code::Blocks你可以從他的官方網站http://www.codeblocks.org獲得。在官方網站上,有兩種版本下載,一種是帶編譯器的,一種是不帶的,我們可以從文件的體積來分辨這些。這里,我下載的是不帶編譯器的。當然,帶編譯器的安裝方式也類似。


安裝


在網上下載Code::Blocks后,雙擊運行安裝。

上面是安裝的歡迎界面

這個是Code::Block的許可證界面。這里,軟件用了GPL,這就說明你可以免費使用和傳播。

這個是詢問你安裝的路徑,你可以選擇自己喜歡的路徑。

這個是詢問你安裝的模式,因為軟件也不大,所以如果你的硬盤空間有空余的話,就選擇完全模式吧。

這個是安裝前的確認,如果沒有什么問題的話,他將開始將Code::Block安裝到你的機器上了。

在一系列的安裝后,你將看到如上的界面。提醒你已經安裝好Code::Block了。Launch Code::Block意思是馬上運行Code::Block



配置


在第一次運行Code::Block時,她會詢問你所使用的編譯器種類。如果不是有特殊要求的話,我這里選擇GNU GCC Compiler。如果你一開始選錯了也沒有關系。

由于,我們安裝的是沒有編譯器的版本。所以,我們這里必須安裝編譯器,具體的安裝方式,可以參照前面的文章。這里,建議安裝MinGW。現在我假設你的編譯器安裝在了,$(MINGW)目錄下。

運行Code::Block,在菜單中選擇Build -> Compiler Options。調出編譯器配置框。

如圖所示,這個就是編譯器選項,我們這里使用的是GCC所以,在最開始選擇。GNU GCC Compiler。說明你選擇使用的是GCC


然后選擇Programs選項卡,設置我們MinGW的路徑。

Compiler's installation directory中添加你MinGW的路徑,按照上面的定義他應該是$(MINGW)。注意別把bin目錄包含進去。如果你只安裝了C語言編譯器,并且你只使用C語言編譯器。請將Linker for dynamic libs中的mingw32-g++.exe改為mingw32-gcc.exe


至此,我們已經順利完成Code::Block的安裝與配置了。如果,你選擇的是帶編譯器的版本,那么你可以忽略配置部分。


使用


總體來說,Code::Block的使用還是比較顯而易見的。對于有一些編程經驗的人,使用Code::Block并不是一件非常困難的事情。當然,Code::Block可以建立自己的項目模板。具體的做法和Dev-C++類似。您可以查看$(CodeBlocks)/share/CodeBlocks/templates目錄中的文件。


最后的內容:


總體來說,這次介紹的兩個IDE總體來說還是不錯的。不過,筆者使用最多的還是Dev-C++。對于Visual-MinGWCode::Blocks我了解并不多。前者是因為并不太喜歡,后者是由于剛出來。不過,還是希望我寫的內容對各位有用。當然,我個人的喜好不會影響各位的使用。現在筆者沒有使用其中任何一款IDE,筆者現在使用的IDE是我自己架設的,在Windows下我使用的是notepad作為我編寫代碼的工具,使用Makefile管理項目。所以,各位可以放心的選擇各自喜好的IDE。不用擔心會不被支持,或者被厭棄。至此,關于IDE的介紹將就到這里結束了。以后我將主要針對函數庫本身做詳細的介紹,并提供教程。


文外音:


首先,對各位讀者表示抱歉。因為原本我準備趁著這次暑假多寫一點東西的。可是,并沒有預期的那么好。原本這篇文章應該在上個月寫出來的。可是,上個月為了練習編程技巧,寫了個Sudoku Puzzle,因此沒能有時間寫文章了。如果各位想要的話,可以問我要。那個程序原本預計一周完成的,可是沒想時間遠遠超出了我的預計。后來,八月初才完成的。本想可以寫了吧,沒想又發起高燒了,結果久久沒能寫出文章,對各位對我的期望,我表示非常抱歉。如果你對于文章有什么意見,疑惑或者問題,可以到http://blog.csdn.net/visioncat上提出。我盡我所能將在第一時間回答您。

上文回顧:

在上一篇文章中,我主要為大家介紹了有關IDE方面的內容。其中主要包括一些我個人比較喜歡的三個IDE。本文,我將為各位介紹GCC的編譯參數以及組成和Makefile的使用方式。


GCC for Win32開發環境介紹(4)


第三章GCC粗探——GCC的組成與附加參數


第一節GCC的家族成員


總的來說,GCC應該是一個編譯器。可是,為什么我還要在這里介紹GCC的家族成員呢?其實,整套的GCC環境并不是由GCC構成的,他是由多個包所組成的。這些包的互相作用產生了GCC的開發環境。其中,有一些包是你開發應用程序所必備的基本包。離開這些包你將無法正常使用GCC


GCC的基本包列表。


GCC的基本開發環境,主要由一下幾個包構成。Binutils,這個是輔助GCC的工具包,里面包含了連接器,匯編器,動態靜態庫生成程序,等等。GCC,這個包是GCC本身。當然GCC包中還包括一下幾個包,如core,java,ada等,每個包都代表了一種語言。然后,就是win32api,mingw-runtime,這個是在Win32下使用的標準函數包。如果,你使用的是Cygwin或者是在Unix環境下,那么這個包就是GlibC


所以,由上所述。GCC的基本包有:binutils gcc glibc/[win32api,mingw-runtime]有了這些包。你基本能夠開始編譯應用程序了。


當然,如果說你想要寫一個小程序。自然這些包已經夠了。但是如果你要寫一個較大的工程。那么,這些包也許就不能很好的勝任你的工作了。因為,對于一個大的項目,需要編譯的文件不只一個,而且還有依賴關系等等。

所以,GCC中還包括gmake包用于管理項目。當然,還有automake。但是我個人還是不太喜歡automakeautomake其實是幫助你自動的管理你的項目,當然實現這個自動也是比較麻煩的,所以與其用automake管理中小型項目,不如用gmake自己寫個腳本。不過,automake通常用于源代碼發布的應用,如果在開發時使用會延長開發周期。

Gmake,automake,都是通過編譯腳本來批量的編譯程序。他們能夠更具你所給定的依賴關系,來自動的判斷需要重新編譯的源代碼,然后編譯。這點的確可以幫助開發人員減輕不少的人力和開發周期。比如,你用Makefile管理一個項目,那么在你第一次編譯程序以后,如果你的源代碼沒有做過任何編輯,那么下次再調用gmake的程序時,gmake就不會再去一一編譯每個文件。而是簡單的連接一下主程序,或者什么都不作的退出(這要取決于你寫的Makefile腳本)


但是,對于有些開發人員來說,上面這些包還是不能滿足他們的要求。因為他們要調試程序。所以,GCC還包括另一個包。那就是GDBgdbGCC開發的,用于跟蹤調試的,命令符型調試器。它的功能還是比較強大的。基本,你能在VC下做到的,GDB也可以。不過,GDB的命令還是比較多的。掌握一些基本的調試命令一般就夠使用了。


總結

GCC開發環境包括如下幾大包。

binary

基本包

提供基本的匯編器,連接器等

gcc

基本包

各種語言的編譯器,包括C,C++,Ada,Java

Win32api,mingwi-runtime/glibc

基本包

系統函數庫

Gmake/automake

需要包

管理項目編譯的程序

gdb

附加包

調試程序


第二節GCC的常用編譯參數


VC,TC等編譯器不同,GCC其實是可以很方便的在提示符下編譯程序的。GCC在提示符下編譯程序,并沒有如同VC那樣的冗長而晦澀的編譯參數。相反,卻有著比VC更靈活且簡短的參數。

不得不承認,不懂GCC編譯參數的人,確實會損失一些GCC的強大功能。所以,我下面簡單介紹一下GCC的一些基本編譯參數。這里,我以C編譯器為例。


編譯二進制代碼

$gcc -c yours.c -o yours.o

使用這段指令,GCC將會把yours.c編譯成yours.o的二進制代碼。其中,yours.o就類似于VC,TC中的.obj文檔。


編譯最簡單的小程序。

$gcc -o yours yours.c

通過這條指令,GCC將會把yours.c源代碼編譯成名為yours的可執行程序。當然,您也可以將yours.c改成我們剛才介紹的yours.o文件。這樣,gcc將使用編譯剛才編譯好的二進制文檔來鏈接程序。這里,格式的特點是,-o后面是一串文件列表,第一個參數是所編譯程序的文件名,從第二個開始,就是您編譯和連接該可執行程序所需要的二進制文檔或者源代碼。


編譯時將自己的頭文件目錄設為默認頭文件目錄

$gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o

這條指令中的-I參數將會把Your_Include_Files_Document_Path添加到你默認的頭文件目錄中。這樣您將可以使用#include <your_include.h>來導入頭文件。


編譯時使用自己的靜態庫存放目錄

$gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o

這條指令將會讓GCC在連接時除了在默認Lib存放目錄中搜索指定的靜態庫以外,還會在Your_Lib_Files_Document_Path中搜索。


編譯時使用靜態連接庫

$gcc -lyour_lib -o yours yours.o

這條指令將會讓GCC在連接時把libyour_lib.a中您所用到的函數連接到可執行程序中。此處注意,GCC所使用的靜態連接庫是lib*.a格式的。在連接時,只且僅需要提供*的內容就可以了。


編譯時使用優化

$gcc -O2 -c yours.c -o yours.o

使用優化方式編譯程序,其中除了-O2以外,還有-O3 -O1等等。他們代表不同的優化等級。最常用的,是-O2優化。當然,還有針對特殊CPU的優化,這里就不介紹了。


編譯時顯示所有錯誤和警告信息

$gcc -Wall -c yours.c -o yours.o

GCC在默認情況下,將對一些如變量申請未使用這樣的問題或者申請了沒有給予初始值的問題忽略。但是,如果使用了-Wall參數,編輯器將列出所有的警告信息。這樣,您就可以知道您的代碼中有多少可能會在其他操作系統下出錯的地方了。(用這個指令看看你的代碼有多少地方寫的不怎么合適。)


編譯連接時,加入調試代碼

$gcc -g -o yours yours.c

正如同VCdebug編譯模式一樣,GCC也有debug模式。添加了-g參數編譯的可執行程序比普通程序略為大一些,其中添加了一些調試代碼。這些代碼將被gdb所支持。


連接時縮小代碼體積

$gcc -s -o yours yours.o

這個參數,似乎我沒有在Unix環境下看到過。也不知道具體什么作用。因為有人說Visual-MinGW生成的代碼小,于是研究了一下她的編譯參數,發現release模式的編譯參數就加了這一項。貌似編譯后的代碼的確縮小了很多。


獲得幫助

$gcc --help

這條指令從意思上就能看出,獲得gcc的幫助信息。如果您有什么特殊需要,也許這個指令能幫上點小忙。


第三節 如何寫一個簡單的Makefile


說了半天Makefile管理項目,我想現在該說一下如何寫了。其實,Makefile文件總體還是比較容易寫的,基本只要你會使用命令行,就可以寫Makefile。下面我簡單介紹一下Makefile的構成和書寫。


一個輸出HelloWorld的簡單Makefile

all:

echo HelloWorld

這個Makefile代碼,運行后將在屏幕上打印一個HelloWorldall其實是類似C代碼中的main函數。gmake程序將在運行Makefile代碼時,首先運行此處的代碼。注意,此處echo前面的是<tab>GCC對空格很敏感的。


添加依賴項的Makefile

all:depend

@echo I am the main

depend:closeecho

@echo I am the depend

closeecho:

@echo off

這個Makefile代碼,的作用還是輸出句子。不同的是她添加了幾個指令塊之間的依賴關系。其中all依賴于dependdepend依賴于closeecho。這樣,程序在編譯時將根據腳本的依賴關系來判斷文件編譯的先后順序。


執行Makefile

$make -f Makefile

通常情況下,不用-f參數,make程序將在當前目錄下搜索名為Makefile的文件作為需要執行的文件。而使用-f將指定Makefile的文件名。


一個完整的Makefile

all:yours

@echo OK

yours:yours.o

gcc -o yours yours.o

yours.o:yours.c

gcc -c yours.c -o yours.o


更多有關Makefile的詳細內容請查相關資料。



文外音:

的確,發現了。我這個系列的文章進展的并沒有我預期和承諾的那么快。確實挺讓我感到無奈的。不過,幸好你能夠理解我。總體來說,本文主要是簡單介紹一下GCC的一些基礎。因為我發現有許多讀者對GCC并不是很了解。

說來也挺無奈的,最近發現原來周圍有個小人當道。此人姓名我也就隱去了。從去年開始,就常常在和我聊得比較好的幾個女生面前造我的謠。所以,原本應該9月該出來的文章拖延到了9月底。說起這個人,我希望大家要以此人為鑒。不要像他那樣。

這人自稱在硬件方面很行,不過據我所知,他無非就是可以把各種型號的主板和硬件編號背出來而已。連基本的線程進程都搞不清楚。還成天鼓吹32bit的機器是淘汰的機器。不得不承認,這位滿口臟話為人無恥的家伙的確硬件方面挺不錯的。但是,我還是覺得做技術的人不要太追求表面的東西,不要追求過于超前的東西,同時也更要注意自己的品行道德。

也許是年紀大了,發了一些牢騷。希望各位不要建議。不過,事以至次,我也無力挽回了。

最后感謝各位對我的支持,更感謝那些愿意為我效力的朋友們。同時,如果您有什么問題或者建議,都可以提出來。為了您能及時準確的得到回復請到http://blog.csdn.net/visioncat上發表你的留言。謝謝


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454105.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

包裝函數

function wrap(object,method,wrapper){ //object:包裝方法所屬對象 method:方法名 wrapper:替換函數var fn object[method];return object[method] function(){return wrapper.apply(this,[fn.bind(this)].concat(Array.prototype.slice.call(arguments)));}; } 轉載于…

JAR——pinyin4j-2.5.0

簡介&#xff1a;將中文轉為拼音&#xff1b; 使用&#xff1a; 123//返回的是字符串String pinyin[] PinyinHelper.toHanyuPinyinStringArray(chinese);//eg:你----ni3本文轉自wauoen51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog.51cto.com/7183397/1605894&#…

Android高效加載大圖、多圖解決方案,有效避免程序OOM

http://blog.csdn.net/guolin_blog/article/details/9316683轉載于:https://www.cnblogs.com/jianglijs/p/7827524.html

Flask 上下文源碼解析

簡單來說&#xff0c;上下文包括request_ctx(封裝了request和session),app_request(封裝了app和g)&#xff0c;兩個ctx都儲存在一個叫做Local的數據結構中&#xff0c;這個結構的作用就是會自動根據不同的線程id返回對應的數據&#xff0c;然后通過一個叫做 LocalStark 的結構把…

reg型變量怎么賦值_UiPath變量介紹和使用

1 變量變量主要用于存儲數據&#xff0c;它在RPA中扮演重要的數據傳遞角色&#xff0c;是RPA編程不可或缺的一部分。它包括變量名稱和變量的值&#xff0c;變量的值支持多種數據類型&#xff0c;包括從通用值&#xff0c;文本&#xff0c;數字&#xff0c;數據表&#xff0c;時…

gcc 使用教程

gcc 使用教程 目 錄 gcc makefile寫法 gcc_egcs使用 gdb使用 gcc常用選項對代碼的影響 一般情況 -O 編譯選項 -O2 編譯選項 -fomit-frame-pointer 編譯選項-fomit-frame-pointer && -O2-fPIC 編譯選項 -static 編譯選項 AT&T的匯編格式 x86內聯匯編 簡述 內聯匯編…

Struts2教程9:實現自已的攔截器

在上一篇中介紹了Struts2攔截器的原理&#xff0c;在這一篇中我們將學習一下如何編寫自己的攔截器。一、攔截器的實現實現一個攔截器非常簡單。實際上&#xff0c;一個攔截器就是一個普通的類&#xff0c;只是這個類必須實現com.opensymphony.xwork2.interceptor.Interceptor接…

標準C程序設計七---66

Linux應用 編程深入 語言編程標準C程序設計七---經典C11程序設計 以下內容為閱讀&#xff1a; 《標準C程序設計》&#xff08;第7版&#xff09; 作者&#xff1a;E. Balagurusamy&#xff08;印&#xff09;&#xff0c; 李周芳譯 清華大學出版社…

深度學習之概述

深度學習的應用場景 1、圖像應用&#xff1a; 1.1 大規模(大數據量)圖片識別(聚類/分類)&#xff0c;如人臉識別&#xff0c;車牌識別&#xff0c;OCR等。人臉識別算法&#xff1a;① faceID ② faceNet 1.2 以圖搜圖&#xff0c;圖像分割 1.3 目標檢測&#xff0…

如何根據對象獲取到對應的表名_Excel VBA 常用對象二

下面繼續講解上一節中未講完的內容&#xff1a;Excel VBA編程中常常使用的那些對象到底是什么&#xff0c;如何在代碼中表示它們。Worksheet對象Worksheet對象代表工作表。工作簿中的每個工作表都是一個Worksheet對象&#xff0c;所有Worksheet對象構成了Worksheets集合。我們使…

PIX525故障一例,求解

IDC機房網絡拓樸如下&#xff1a;IDC核心交換機-----通過一條網線-------機柜D-LNKI交換機------PIX 525------CISCO交換機------各WEB服務器。其中D-LINK交換機的IP為192.168.2.11&#xff0c;也就是下面日志中的IP。另外&#xff0c;之所以IDC和PIX之間再加一臺DLINK是因為有…

gcc教程(轉)

gcc 目 錄 gcc makefile寫法 gcc_egcs使用 gdb使用 gcc常用選項對代碼的影響 一般情況 -O 編譯選項 -O2 編譯選項 -fomit-frame-pointer 編譯選項 -fomit-frame-pointer && -O2 -fPIC 編譯選項 -static 編譯選項 AT&T的匯編格式 x86內聯匯編 簡述 內聯匯編 程序模…

深度學習之 BP 算法

神經網絡的一種求解W的算法&#xff0c;分為信號“正向傳播(FP)”求損失&#xff0c;“反向傳播(BP)”回傳誤差&#xff1b;根據誤差值修改每層的權重&#xff0c;繼續迭代。 BP算法也叫做δ算法。以三層的感知器為例&#xff08;假定現在隱層和輸出層均存在相同類型的激活函數…

python自帶的解釋器叫做_python學習

一、PYTHON中的元素1.基本元素運算符&#xff1a; - * / %等等除法&#xff1a;" / " 表示浮點數除法&#xff0c;返回浮點結果;" // " 表示整數除法,返回不大于結果的一個最大的整數運算順序&#xff1a;先乘除 再加減 括號最優先變量&#xff1a;就是一…

IE打印空白

今天碰到HR經理碰到一個問題&#xff0c;就是windows 7 64位操作系統&#xff0c;但是打印空白&#xff0c;打印出來像白紙一樣&#xff01;經過查看和總結&#xff0c;確認是&#xff1a;由于保護模式下 %Temp%\Low 文件夾工作不正常引起的&#xff01;故障打印白紙下面會出現…

Python Matplotlib.plot Update image Questions

1. 最近在測試一款設備&#xff0c;采集了一些設備后需要一幀一幀顯示圖像&#xff0c;經常使用Python,所以選用了Matplotlib進行圖像操作 數據結構&#xff1a; timesatamp polar_distance horizontal_angle refelectivity_intensity,所有數據類型都是 float&#xff0c;儲存在…

深度學習之 RBF神經網絡

RBF神經網絡通常只有三層&#xff0c;即輸入層、中間層和輸出層。其中中間層主要計算輸入x和樣本矢量c&#xff08;記憶樣本&#xff09;之間的歐式距離的Radial Basis Function (RBF)的值&#xff0c;輸出層對其做一個線性的組合。 徑向基函數&#xff1a; RBF神經網絡的訓練…

redis 隊列_Redis與Rabbitmq消息隊列的區別

將redis發布訂閱模式用做消息隊列和rabbitmq的區別&#xff1a;可靠性 redis &#xff1a;沒有相應的機制保證消息的可靠消費&#xff0c;如果發布者發布一條消息&#xff0c;而沒有對應的訂閱者的話&#xff0c;這條消息將丟失&#xff0c;不會存在內存中&#xff1b;rabbit…

EasyUI中那些不容易被發現的坑——EasyUI重復請求2次的問題

問題控件&#xff1a;datagrid、combobox、所有能設置url屬性的控件 問題版本&#xff1a;1.4.4、1.4.5&#xff08;之前的版本沒測&#xff09; 問題如圖&#xff1a; 重復請求2次&#xff0c;錯誤代碼如圖&#xff1a; 錯誤問題分析&#xff1a;html加載的時候回請求url加載數…

GCC編譯的背后( 預處理和編譯 匯編和鏈接 )

發表于 2010年05月18日 22:01 分類: 編程coding統計: 1評/465閱 2人收藏此文章&#xff0c; 收藏此文章(?)by falcon<zhangjinwgmail.com> 2008-02-22 平時在Linux下寫代碼&#xff0c;直接用"gcc -o out in.c"就把代碼編譯好了&#xff0c;但是這后面到底做了…