g++

g++

gcc and g++分別是GNU的c & c++編譯器。gcc/g++在執行編譯的時候一般有下面4步:

⒈預處理,生成.i的檔案[預處理器cpp]。

⒉將預處理後的檔案轉換成彙編語言,生成檔案.s[編譯器egcs]。 ⒊由彙編變為目標代碼(機器代碼)生成.o的檔案[彙編器as]。

⒋連線目標代碼,生成可執行程式[連結器ld]。

基本介紹

  • 中文名:GNU的c++編譯器
  • 外文名:g++
  • 性質: c++編譯器
  • 編譯步驟:預處理、連線目標代碼
  • 用途:編譯語言
參數詳解,例子用法,

參數詳解

-x language filename
設定檔案所使用的語言,使後綴名無效,對以後的多個有效.也就是根
據約定C語言的後綴名稱是.c的,而C++的後綴名是.C或者.cpp,如果
你有個性,決定你的C代碼檔案的後綴名是.pig,那你就要用這個參數,
這個參數對他後面的檔案名稱都起作用,除非到了下一個參數的使用。
可以使用的參數嗎? 有下面的這些:
`c',`objective-c',`c-header',`c++',`cpp-output',
`assembler',and `assembler-with-cpp'.
看到英文,應該可以理解的。

例子用法

gcc -x c hello.pig
-x none filename
關掉上一個選項,也就是讓gcc根據檔案名稱後綴,自動識別檔案類型
例子用法:
gcc -x c hello.pig -x none hello2.c
-c
只激活預處理,編譯,和彙編,也就是他只把程式做成obj檔案
例子用法:
gcc -c hello.c
他將生成.o的obj檔案
-S
只激活預處理和編譯,就是指把檔案編譯成為彙編代碼。
例子用法
gcc -S hello.c
他將生成.s的彙編代碼,你可以用文本編輯器察看
-E
只激活預處理,這個不生成檔案,你需要把它重定向到一個輸出檔案里
面.
例子用法:
gcc -E hello.c > pianoapan.txt
gcc -E hello.c | more
一個hello word 也要預處理成800行的代碼
-o
制定目標名稱,預設的時候,gcc 編譯出來的檔案是a.out,很難聽,如果
你和我有同感,改掉它
例子用法
gcc -o hello.exehello.c (Windows用習慣了)
gcc -o hello.asm -S hello.c
-pipe
使用管道代替編譯中臨時檔案,在使用非gnu彙編工具的時候,可能有些問
gcc -pipe -o hello.exe hello.c
-ansi
關閉gnu c中與ansi c不兼容的特性,激活ansi c的專有特性(包括禁止一
些asm inline typeof關鍵字,以及UNIX,vax等預處理宏,
-fno-asm
此選項實現ansi選項的功能的一部分,它禁止將asm,inline和typeof用作
關鍵字。
-fno-strict-prototype
只對g++起作用,使用這個選項,g++將對不帶參數的函式,都認為是沒有顯式
的對參數的個數和類型說明,而不是沒有參數.
而gcc無論是否使用這個參數,都將對沒有帶參數的函式,認為城沒有顯式說
明的類型
-fthis-is-varialble
就是向傳統c++看齊,可以使用this當一般變數使用.
-fcond-mismatch
允許條件表達式的第二和第三參數類型不匹配,表達式的值將為void類型
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
這四個參數是對char類型進行設定,決定將char類型設定成unsigned char(前
兩個參數)或者 signed char(後兩個參數)
-include file
包含某個代碼,簡單來說,就是便以某個檔案,需要另一個檔案的時候,就可以
用它設定,功能就相當於在代碼中使用#include<filename>
例子用法:
gcc hello.c -include /root/pianopan.h
-imacros file
將file檔案的宏,擴展到gcc/g++的輸入檔案,宏定義本身並不在輸入檔案
-Dmacro
相當於C語言中的#define macro
-Dmacro=defn
相當於C語言中的#define macro=defn
-Umacro
相當於C語言中的#undef macro
-undef
取消對任何非標準宏的定義
-Idir
在你是用#include"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭
檔案,如果沒有找到,他回到預設的頭檔案目錄找,如果使用-I制定了目錄,他
回先在你所制定的目錄查找,然後再按常規的順序去找.
對於#include<file>,gcc/g++會到-I制定的目錄查找,查找不到,然後將到系
統的預設的頭檔案目錄查找
-I-
就是取消前一個參數的功能,所以一般在-Idir之後使用
-idirafter dir
在-I的目錄裡面查找失敗,講到這個目錄裡面查找.
-iprefix prefix
-iwithprefix dir
一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找
-nostdinc
使編譯器不再系統預設的頭檔案目錄裡面找頭檔案,一般和-I聯合使用,明確
限定頭檔案的位置
-nostdin C++
規定不在g++指定的標準路經中搜尋,但仍在其他路徑中搜尋,.此選項在創建
libg++庫使用
-C
在預處理的時候,不刪除注釋信息,一般和-E使用,有時候分析程式,用這個很
方便的
-M
生成檔案關聯的信息。包含目標檔案所依賴的所有原始碼
你可以用gcc -M hello.c來測試一下,很簡單。
-MM
和上面的那個一樣,但是它將忽略由#include<file>;造成的依賴關係。
-MD
和-M相同,但是輸出將導入到.d的檔案裡面
-MMD
和-MM相同,但是輸出將導入到.d的檔案裡面
-Wa,option
此選項傳遞option給彙編程式;如果option中間有逗號,就將option分成多個選
項,然後傳遞給會彙編程式
-Wl.option
此選項傳遞option給連線程式;如果option中間有逗號,就將option分成多個選
項,然後傳遞給會連線程式.
-llibrary
制定編譯的時候使用的庫
例子用法
gcc -lcurses hello.c
使用ncurses庫編譯程式
-Ldir
制定編譯的時候,搜尋庫的路徑。比如你自己的庫,可以用它制定目錄,不然
編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。
-O0
-O1
-O2
-O3
編譯器的最佳化選項的4個級別,-O0表示沒有最佳化,-O1為預設值,-O3最佳化級別最
-g
只是編譯器,在編譯的時候,產生調試信息。
-gstabs
此選項以stabs格式聲稱調試信息,但是不包括gdb調試信息.
-gstabs+
此選項以stabs格式聲稱調試信息,並且包含僅供gdb使用的額外調試信息.
-ggdb
此選項將儘可能的生成gdb的可以使用的調試信息.
-static
此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大,也不需要什麼
動態連線庫,就可以運行.
-share
此選項將儘量使用動態庫,所以生成檔案比較小,但是需要系統由動態庫.
-traditional
試圖讓編譯器支持傳統的C語言特性
GNU 的調試器稱為 gdb,該程式是一個互動式工具,工作在字元模式。在 X Window 系統中,有一個 gdb 的
前端圖形工具,稱為 xxgdb。gdb 是功能強大的調試程式,可完成如下的調試任務:
* 設定斷點
* 監視程式變數的值;
* 程式的單步執行;
* 修改變數的值。
在可以使用 gdb 調試程式之前,必須使用 -g 選項編譯源檔案。可在 makefile 中如下定義 CFLAGS 變數:
CFLAGS = -g
運行 gdb 調試程式時通常使用如下的命令:
gdb progname
在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有:
* aliases:命令別名
* breakpoints:斷點定義;
* data:數據查看;
* files:指定並查看檔案;
* internals:維護命令;
* running:程式執行;
* stack:調用棧查看;
* statu:狀態查看;
* tracepoints:跟蹤程式執行。
鍵入 help 後跟命令的分類名,可獲得該類命令的詳細清單。
#DENO#
gdb 的常用命令
表 1-4 常用的 gdb 命令
命令 解釋
break NUM 在指定的行上設定斷點
bt 顯示所有的調用棧幀。該命令可用來顯示函式的調用順序。
clear 刪除設定在特定源檔案、特定行上的斷點。其用法為:clear FILENAME:NUM。
continue 繼續執行正在調試的程式。該命令用在程式由於處理信號或斷點而
導致停止運行時。
display EXPR 每次程式停止後顯示表達式的值。表達式由程式定義的變數組成。
file FILE 裝載指定的執行檔進行調試。
help NAME 顯示指定命令的幫助信息。
info break 顯示當前斷點清單,包括到達斷點處的次數等。
info files 顯示被調試檔案的詳細信息。
info func 顯示所有的函式名稱。
info local 顯示當函式中的局部變數信息。
info prog 顯示被調試程式執行狀態
info var 顯示所有的全局和靜態變數名稱。
kill 終止正被調試的程式。
list 顯示原始碼段。
make 在不退出 gdb 的情況下運行 make 工具。
next 在不單步執行進入其他函式的情況下,向前執行一行原始碼。
print EXPR 顯示表達式 EXPR 的值。
⒈8.5 gdb 使用範例
-----------------
清單 一個有錯誤的 C 源程式 bugging.c
-----------------
#include<stdio.h>#include<string.h>staticcharbuff[256];staticchar*string;intmain(){printf("Pleaseinputastring:");gets(string);printf("\nYourstringis:%s\n",string);return0;}
-----------------
上面這個程式很簡單,其目的是接受用戶的輸入,然後將用戶的輸入列印出來。該程式使用了一個未經過初
始化的字元串地址 string,因此,編譯並運行之後,將出現 Segment Fault 錯誤:
$ gcc -o test -g test.c
$ ./test
Please input a string: asfd
Segmentation fault (core dumped)
為了查找該程式中出現的問題,我們利用 gdb,並按如下的步驟進行:
1.運行 gdb bugging 命令,裝入 bugging 執行檔
2.執行裝入的 bugging 命令;
3.使用 where 命令查看程式出錯的地方;
4.利用 list 命令查看調用 gets 函式附近的代碼;
5.唯一能夠導致 gets 函式出錯的因素就是變數 string。用 print 命令查看 string 的值;
6.在 gdb 中,我們可以直接修改變數的值,只要將 string 取一個合法的指針值就可以了,為此,我們在第
11 行處設定斷點
7.程式重新運行到第 11 行處停止,這時,我們可以用 set variable 命令修改 string 的取值;
8.然後繼續運行,將看到正確的程式運行結果。

相關詞條

熱門詞條

聯絡我們