基於Linux的C程式設計(一)

2022-09-06 10:45:19 字數 2445 閱讀 9730

一、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.伺服器端和客戶端程式之間的差別 伺服器端和客戶端兩個流程之間的主要差別...