一、gcc概述
1、gcc概述
乙個c/c++程式從開始編碼到生成二進位制可執行檔案至少要經過四個步驟。
(1)預處理:對原始檔的巨集進行展開。
(2)編譯:將源程式編譯成彙編檔案。
(3)彙編:將彙編檔案編譯成機器碼。
gcc在編譯時根據輸入檔案類別和引數選項,可以分別完成上述四個步驟,產生對應的處理檔案,也可以一次性完成所有步驟,直接生成可執行檔案。
下面是一些gcc副檔名規範:
(1).c為字尾的檔案,是c語言源**檔案。
(2).h為字尾的檔案,是標頭檔案。
(3).c,.cc,.cpp,.cp或.cxx為字尾的檔案,是c++源**檔案。
(4).h為字尾的檔案,是程式所包含得而標頭檔案。
(5).i為字尾的檔案,是已經預處理過的c源**。
(6).ii為字尾的檔案,是已經預處理過的c++源**檔案。
(7).m為字尾的檔案,是object-c源**檔案。
(8).o為字尾的檔案,是編譯後的目標檔案。
(9).s為字尾的檔案,是組合語言源**。
(10).s為字尾的檔案,是經過預編譯的組合語言源**檔案。
2.gcc使用方法
在使用gcc編譯器的時候,我們必須給出一系列必要的引數選項和檔名稱。
gcc最基本的用法是:gcc [options] [filenames]
(1)無選項編譯鏈結
用法:gcc test.c
(2)選項-o
用法:gcc test.c -o test
作用:將test.c預處理、彙編、編譯並廉潔成可執行檔案test。-o選項用來指定輸出檔案的檔名。
(3)選項-e
用法:gcc -e test.c -o test.i
作用:將test.c預處理輸出test.i檔案。
(4)選項-s
用法:gcc -s test.i
作用:將預處理輸出檔案test.i彙編成test.s檔案
(5)選項 -c
用法:gcc -c test.s
作用:將彙編輸出檔案test.s編譯輸出test.o檔案。
(6)無選項鏈結
用法:gcc test.o -o test
(7)選項-o
用法:gcc -o test.c -o test
作用:使用編譯優化級別編譯程式。級別為1-3,級別越大優化效果越好,但編譯時間越長。
(8)多原始檔的編譯方法
如果有多個原始檔,基本上有兩種編譯方法(假設有兩個原始檔為test.c和testfun.c)
1、多個檔案一起編譯
用法:gcc testfun.c test.c -o test
2、分別編譯各個原始檔,之後對編譯後輸出的目標檔案鏈結。
用法:gcc -c testfun.c //將testfun.c編譯成testfun.o
gcc -c test.c //將test.c編譯成test.o
gcc -o testfun.o test.o -o test //將testfun.o和test.o鏈結成test
以上兩種方法相比較,第一種方法編譯時需要所有的檔案重新編譯,而第二種方法可以只重新編譯修改的檔案,未修改的檔案不用重新編譯。
3、c程式除錯
c程式的除錯分為靜態除錯和動態除錯。靜態除錯用在程式編譯階段查錯並修正錯誤,它主要利用gcc編譯器對語法錯誤的檢查進行排錯。
動態除錯則用在程式執行階段的錯誤檢查與修正,適用於檢查演算法的錯誤、輸入輸出的錯誤等。
程式的動態除錯需要借助除錯工具,linux系統包含了乙個叫gdb(gnu debugger)的gnu除錯工具。gdb是是乙個用來除錯c和c++程式的偵錯程式,是乙個互動式工具,工作在字元模式下。以下是gdb所提供的一些功能:
(1)設定斷點。
(2)監視程式變數的值。
(3)程式的單步執行。
(4)修改變數的值。
為了使gdb正常工作,必須使用-g選項編譯原始檔,使程式在編譯時包含除錯資訊。在命令列上鍵入gdb並按回車鍵就可以執行gdb。
進入gdb環境後,就可以輸入相應的命令對程式進行除錯。
(1)file:裝入想要除錯的可執行檔案。
(2)kill:終止正在除錯的程式。
(3)list:檢視指定檔案或者函式的源**,並標出行號。
(4)next:單步執行,但不進入函式內部。
(5)step:單步執行而且進入函式內部。
(6)run:執行當前被除錯的程式。
(7)quit:退出gdb環境。
(8)watch:監視乙個變數的值而不管它何時被改變。
(9)print:檢視變數或表示式的值。
(10)break:在**裡設定斷點,這將使程式執行到這裡時被掛起。
(11)make:不退出gdb就可以重新產生可執行檔案。
(12)shell:不離開gdb就執行shell命令。
具體的gdb操作手冊請參照:
linux下基於C語言的訊號程式設計例項
include include include include include void sig handler int sig no,siginfo t info,void ctext else return 常用訊號列表 sigint ctrl c sigquit ctrl sigpipe 管道...
基於Linux的socket程式設計模板
基於linux的socket程式設計模板 在網路程式設計程式設計中,我們經常會遇到這樣一種c s架構,伺服器端 server 監聽客戶端 client 傳送過來的命令,然後解析該命令,並做對應的處理,最後返回處理結果 例如成功或者失敗及原因 給客戶端。在這種情況客戶端必須實現的的介面有 連線伺服器 ...
基於Linux下的UDP程式設計
一.linux下udp程式設計框架 使用udp進行程式設計可以分為客戶端和伺服器端兩部分。1.伺服器端程式包括 建立套接字 將套接字位址結構進行繫結 讀寫資料 關閉套接字 2.客戶端程式包括 建立套接字 讀寫資料 關閉套接字 3.伺服器端和客戶端程式之間的差別 伺服器端和客戶端兩個流程之間的主要差別...