【C編程基礎】C編譯鏈接命令gcc


1.gcc安裝

rpm -qa|grep gcc    ==>檢查gcc是否安裝
gcc -v              ==>檢查gcc版本 yum -y install gcc ==>安裝gcc

 2.基本語法

gcc最基本的用法是:gcc [options] [filenames]

說明:如果已經為最新的目標文件,則不重新編譯。使用示例test.c源碼如下:

#include <stdio.h>
int main(void)
{
    printf("Hello world/n");
    return 0;
}

(1)編譯-c

gcc -c test.c             ==>編譯不鏈接生成目標文件test.o
gcc -c test.c -o test.o   ==>同上
gcc -c -o test.o test.c   ==>同上

(2)鏈接-o

gcc  test.o -o test==>鏈接生成可執行文件test

(3)編譯鏈接-o

gcc test.c -o test         ==>編譯鏈接生成可執行文件test

(4)代碼優化-O和引用頭文件目錄-I

gcc –c –O –I dirname test.c  ==>使用系統庫則不用特意指出/usr/lib和/lib

(5)函數庫引用-lname

 -lname 鏈接時裝載名為 libname.a 的函數庫。例如,-lm 表示鏈接名為 libm.a 的數學函數庫。

gcc test.c testsub.c -lm -o test

補充:自定義函數庫(打包中間目標文件)ar命令

如果需要鏈接中間目標文件太多,鏈接時需要明顯地指出所有中間目標文件名,十分不便。可以給中間目標文件打個包,在Windows下這種包叫“庫文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件靜態庫。

PS:我們可以使用中間目標文件(O文件或是OBJ文件)或靜態庫文件來鏈接我們的應用程序。

ar crv libtest.a *.o  ==>將該目錄下的所有目標文件打包生成了libtest.a文件靜態庫

3.警告信息選項

使用示例main.c源文件如下:

#include <stdio.h>  
  
 void main(void)  
 {  
     long long int var = 1; printf("It is not standard C code!/n"); }

(1)-pedantic 

當gcc在編譯不符合ANSI/ISO C 語言標准的源代碼時,將產生相應的警告信息。

執行語句 gcc -pedantic main.c -o main

 (2)-Wall

使 gcc 產生盡可能多的警告信息,建議在用 gcc 編譯源代碼時始終帶上 -Wall 選項

執行語句 gcc -Wall main.c -o main

(3)-Werror

gcc 將所有的警告當成錯誤進行處理,產生警告地方停止編譯,這在使用自動編譯工具(如 Make 等)時非常有用。

執行語句 gcc -Werror main.c -o main

(4)-w

關閉任何以W開頭的警告信息,,建議不要使用此項。

執行語句 gcc -w main.c -o main

4.使用gdb進行調試

gdb是Linux下一款功能強大的調試工具。默認情況下,gcc 在編譯時不會將調試符號插入到生成的二進制代碼中,因為這樣會增加可執行文件的大小。如果需要在編譯時生成調試符號信息,可以使用 gcc 的 -g 或 -ggdb 選項。

(1)gdb功能

設置斷點

 監視程序變量的值

l程序的單步執行

 顯示、修改變量的值

 顯示、修改寄存器

 查看程序的堆棧情況

 遠程調試

(2)gdb調試過程

a.程序經過預處理后,即進入編譯階段,進入編譯階段,首先聲明編譯:

b.格式:gdb test.c -o test -g

c.進入編譯:gdb test

d.顯示需要編譯調試的源程序:l(list)//list filename

e.設置斷點:b(break)行號

f.查看設置的斷點:info b

g.運行調試程序:run

h.跳到下一個斷點:c(continue)

i.單步運行的話使用:n(next)/s(step into)跳到函數體 //區別在與:next執行函數體,而step不執行函數體

j.調試過程中查看某個變量的變化:print i (每次都要手動設置)//display i(設置一次一直尾隨,直到用“undisplay 變量標號” 停止)

k.退出當前的調試使用finish 跳出函數

l.清楚斷點 clear 行號

m.Delete 斷點信息序號// 刪除所有斷點或設置的要刪除的斷點

n.退出調試 q

o.b  num  if  i==20 設置斷點的觸發條件

p.condition num i==50 改變斷點的觸發條件

(3)常用命令匯總

 1 (1) gdb 可執行文件 : 表示對某個文件進行調試
 2 (2) b 函數名/行數  :  在某個函數名或行數前設置斷點
 3 (3) run/r          : 表示開始運行,如果是正在調試的程序的話,表示再次進行調試
 4 (4) n/next         : 表示執行下一行語句
 5 (5) l/list         : 列出源碼默認10行(當前位置的上下共10行)
 6     list 行號      : 列出行號上下共10行的源碼
 7     list 函數名    : 列出函數名上下共10行的源碼
 8 (6) s/step         : 表示單步執行,進入函數
 9 (7) p /x 變量名    : 按16進制輸出變量的值
10       /d           : 按10進制
11       /o           : 按八進制
12 (8) set var 變量名=值 : 設置變量的值
13 (9) bt(backtrace)  : 查看各級函數調用及參數,簡寫bt
14 (10)q/quit         : 退出
15 (11)finish         : 連續運行到當前函數返回為止,然后停下來等待命令
16 (12)continue/c     : 跳轉到下個斷點,或者跳轉到觀察點
17 (13)ptype 變量名   : 可以查看變量的類型,簡寫為pt
18 (14)watch
19     作用:一般用來觀察某個變量/內存地址的狀態(也可以是表達式),
20           如可以監控該變量/內存值是否被程序讀/寫情況。
21     有三種方法:
22     1.watch expr(指定變量/內存地址/表達式)
23     一旦expr的值有變化時,將停住程序。
24     2.rwatch expr
25     當expr被讀時,停住程序。
26     3.awatch expr
27     當expr被讀或被寫時,停住程序。
28     watch使用步驟:
29         1. 使用break在要觀察的變量所在處設置斷點;
30         2. 使用run執行,直到斷點;
31         3. 使用watch設置觀察點;
32         4. 使用continue觀察設置的觀察點是否有變化。
33 (15)start            : 開始執行程序,停在main函數第一行語句前面等待命令
34 (16)info watchpoints : 列出所有觀察點
35     info breakpoints : 查看當前設置的所有斷點
36 (17)d/delete [breakpoinsts num] [rang...]         
37     d/delete         : 刪除所有斷點
38     d/delete num     : 刪除breakpoints為num的斷點
39     d/delete num1-num2 : 刪除breakpoints為num1-num2的斷點
40 (18)enable num       : 啟用num號斷點
41 (19)disable num      : 關閉num號斷點
42 (20)u/until          : 結束當前循環

 

5.IDE工具

  可以使用IDE工具codeblocks

 

參考文檔:

gcc的使用簡介與命令行參數說明

GCC編譯器編譯鏈接

gcc編譯與gdb調試簡要步驟

Linux下編輯、編譯、調試命令總結——gcc和gdb描述


免責聲明!

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



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