在windows下使用GNU工具-gcc編譯器


2018-01-12  19:10:42

在windows下使用GNU編譯器-gcc編譯器

 

1、MinGW(Minimalist GNU on Windows)編譯工具介紹

  MinGW是指只用自由軟件來生成純粹的Win32可執行文件的編譯環境,它是Minimalist(簡化) GNU on Windows的略稱。

unix-like系統上的gcc的windows移植版本:MinGW編譯系統/工具

實際上 MinGW 並不是一個 單純的C/C++ 編譯器,而是一套 GNU 工具集合。除開 GCC 以外,MinGW 還包含有一些其他的 GNU 程序開發工具 (比如 gawk bison 等等)。開發 MinGW 是為了那些不喜歡工作在 Linux(FreeBSD) 操作系統而留在 Windows 的人提供一套符合 GNU 的 GNU 工作環境。所以,使用 MinGW 我們就可以像在 Linux 下一樣使用 GNU 程序開發工具。

  GCC 就是 MinGW 的核心所在,GCC 是一套支持眾多計算機程序語言的編譯系統,而且在語言標准的實現上是最接近於標准的。並且 GCC 幾乎可以移植到目前所有可用的計算機平台。(我的電腦上就還裝有 DevKitPro,里面包含 GCC 的 ARM(for GBA/DS/GP32) 和 MIPS(for PSP) 版本。)

  GCC 本身不像 VC 那樣擁有IDE 界面(在 Windows 上也存在 Dev C++ 之類的支持 MinGW 編譯器的 IDE)。源代碼編輯你可以選用任何你喜歡的文本編輯器(據說微軟的開發人員包括 VC 的開發都不用 VC 所帶的 IDE 編輯器,而是選用 GNU 的 VIM 編輯器)。然后使用 make 等工具來進行軟件項目的編譯、鏈接、打包乃至發布。而像 cvs(svn) 源代碼版本控制工具可以讓世界上任何一個角落的人都可以參與到軟件項目中來。

  文本編輯器產生源文件+gcc編譯系統編譯(產生可執行文件??)

2、MinGW主要文件

  gcc-core C語言編譯器 
  gcc-c++ C++語言編譯器 
  mingw-runtime MinGW的運行時庫(這個必須安裝) 
  win32api win32的API函數頭文件和連接庫 
  binutils MinGW的匯編器和連接器等基礎工具 
  gdb MinGW中的調試工具 
  mingw32-make Make工具,用以更好的管理你的項目 

 

3、gcc常見命令

 

gcc -v           //查看gcc的版本信息
gcc -o test   test.c    //執行test.c,產生文件命名為test,若省略則默認為a
gcc -E           //預處理
              //-g 可執行程序包含調試信息
              // -o output_filename,確定輸出文件的名稱為output_filename             
               //-c 只編譯不鏈接
                         //-c 產生.o文件,就是obj文件,不產生執行文件 

 

$:表示程序所在目錄,比如:F:\MinGW>

3. 1、執行如下命令:

$ gcc -o hello hello.c
運行如下 : $ hello
輸出: Hello,world!

3.2、我們也可以分步編譯如下:

分步暫時省略,太懶了,看上面的代碼

3.3、我們可以把幾個文件一同編譯生成同一個可執行文件。

比如:一個工程有main.c、 foo.c 、def.c生成foo的可執行文件。
編譯命令如下:

$ gcc –c main.c foo.c def.c –o foo
//或者:
$ gcc –o foo main.c foo.c def.c

 

4、庫依賴(庫依賴windows下應該是和linux下一樣的)

函數庫是一些頭文件(.h)和庫文件(.so或者.a)的集合。Linux下的大多數函數都默認將頭文件放到/usr/include/目錄下,而庫文件則放到/usr/lib/目錄下,但並非絕對如此。因此GCC設有添加頭文件和庫文件的編譯選項開關。
1. 添加頭文件:-I
例如在/home/work/include/目錄下有編譯foo.c所需頭文件def.h,為了讓GCC能找到它們,就需要使用-I選項:

$ gcc foo.c -I /home/work/include/def.h -o foo

2. 添加庫文件:-L
例如在/home/work/lib/目錄下有鏈接所需庫文件libdef.so,為了讓GCC能找到它們,就需要使用-L選項:

$ gcc foo.c –L /home/work/lib –ldef.a –o foo

說明:-l選項指示GCC去連接庫文件libdef.so。Linux下的庫文件命名有一個約定,即庫文件以lib三個字母開頭,因為所有的庫文件都遵循這個約定,故在用-l選項指定鏈接的庫文件名時可以省去lib三個字母。
[題外語] 
Linux下的庫文件分為動態鏈接庫(.so文件)和靜態鏈接庫(.a文件)。GCC默認為動態庫優先,若想在動態庫和靜態庫同時存在的時候鏈接靜態庫需要指明為-static選項。比如上例中如還有一個libdef.a而你想鏈接libdef.a時候命令如下:

$ gcc foo.c –L /home/work/lib –static –ldef.a –o foo

5、代碼優化

GCC提供不同程度的代碼優化功能。開關選項是:-On,n取值為0到3。默認為1。-O0表示沒有優化,而-O3是最高優化。優化級別越高代碼運行越快,但並不是所有代碼都能夠加載最高優化,而應該視具體情況而定。但一般都使用-O2選項,因為它在優化長度、編譯時間和代碼大小之間,取得了一個比較理想的平衡點。
以下這段是我摘自別人文章的,說的比較詳細:
編譯時使用選項-O可以告訴GCC同時減小代碼的長度和執行時間,其效果等價於-O1。在這一級別上能夠進行的優化類型雖然取決於目標處理器,但一般都會包括線程跳轉(Thread Jump)和延遲退棧(Deferred Stack Pops)兩種優化。選項-O2告訴GCC除了完成所有-O1級別的優化之外,同時還要進行一些額外的調整工作,如處理器指令調度等。選項-O3則除了完成所有-O2級別的優化之外,還包括循環展開和其它一些與處理器特性相關的優化工作。通常來說,數字越大優化的等級越高,同時也就意味着程序的運行速度越快。
下面通過具體實例來感受一下GCC的代碼優化功能,所用程序如清單3所示。

 

6、15個常用的gcc命令

http://blog.csdn.net/typename/article/details/8170213


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM