細說GCC、Make、GDB

一、GCC

//test.c

#include <stdio.h>
#include <stdlib.h>
void main()
{
    printf("GCC is a strong tool ");
    return;
}

程序編譯過程如下圖:

這裏寫圖片描述
**

使用命令表示過程如下:


gcc -o test test.c

**
這條命令告訴GCC對源程序test.c進行編譯和鏈接,並使用參數-o創建名爲test的可執行程序。這條命令實際上可細分爲三個步驟:
1) 預編譯
在命令行鍵入命令。

gcc -o test1.c -E test.c

這條命令告訴GCC對源程序test.c進行預編譯,預編譯結果輸出到test1.c文件中。

2) 編譯

gcc -o test.o -c test1.c

這條命令告訴GCC對源程序test.c進行編譯,但不鏈接,編譯輸出到test.o文件中。
3) 鏈接

gcc -o test test.o

這條命令告訴GCC對源程序test.o進行鏈接,生成可執行程序test。


GCC 編譯選項

-o filename 輸出文件名,如果沒指定filename,默認爲a.out
-c 只編譯,不鏈接
-E 預編譯
-g 包含調試信息
-l 鏈接指定的庫文件
-O 優化編譯後的代碼
-w 關閉所有告警信息
-Wall 開啓所有告警信息


GCC 辨識文件擴展名

c—->C語言源文件
cpp—-> C++源文件
s —->彙編語言源文件
o—-> 編譯後的目標代碼文件
a,so—-> 編譯後的庫文件


GCC 默認只鏈接C的標準庫,並不鏈接C++標準庫

gcc -o test test.cpp(編譯報錯)

gcc –lstdc++ -o test test.cpp

二、Make

爲什麼需要make指令?

1.任何一個商業項目都會包含多個源代碼,這樣需要的編譯與鏈接指令就會很多。同時編譯生成的中間目標文件也會太多,銜接過程會非常不方便。
2.make是一種控制編譯或者重複編譯軟件的工具。
3.make可以自動管理軟件的編譯內容、方式和時機,從而使程序員把更多的精力集中在編寫代碼上。

注:在windows 下,.lib文件就是將這些中間文件打包而成的庫文件,linux下,打包而成的庫文件爲.a文件。


make指令工作原理
makefile是一個文本形式的腳本文件,其中包含一些規則告訴make編譯哪些文件,怎麼樣編譯以及在什麼條件下編譯。
makefile文件規則遵循以下通用形式
target:dependency [dependency[…]]
command
command
[…]
每個command第一個字符必須是tab鍵,而不是空格鍵,不然make會報錯並停止。


eg1:最簡單的一個makefile文件
1.vi makefile
2.內容如下:
    start:
    gcc -o test test.c
3.輸入make,makefile文件將會被執行

eg2:稍微複雜的makefile,內容如下:
start:test .o
        gcc -o test test .o
test .o:
        gcc -o test .o -c test .c
target start後面的test .o代表其下的command依賴與test .o這個target。所以make先執行了test .o這個target下的command

eg3:進一步完善的makefile,內容如下:
start:test.o
        gcc -o test test .o

test .o:
        gcc -o test .o -c test .c

clear:
        rm -rf hello.o
增加了target clear。
輸入make clear,make會直接執行clear其下的command

eg4:在makefile執行shell命令:
start:test.o
        gcc -o test test.o
        @echo '---------------success---------------'

test .o:
        gcc -o test .o -c test .c

clear:
        rm -rf test .o增加了target clear
注:前面加@符號,爲了不將echo本身輸出。

eg5:在makefile使用變量(約定大寫表示),varname=some_text
引用變量:$(varname)

CC=gcc

start:test.o
        $(CC) -o test test.o
        @echo '---------------ok---------------'

test.o:
        $(CC) -o test.o -c test.c

clear:
        rm -rf test.o

eg6:在makefile使用變量(約定大寫表示),varname=some_text
引用變量:$(varname)

CC=gcc
SRCS=test.c
OBJS=test.o
EXEC=test

start:$(OBJS)

    $(CC) -o $(EXEC) $(OBJS) 
    @echo '---------------ok---------------'

$(OBJS):

$(CC) -o $(OBJS) -c $(SRCS) 

clear:

 rm -rf $(OBJS)   

eg7: 使用模式規則
.SUFFIXES:.c .o 表示任何x.c文件與x.o關聯
.c.o:表示make定義了一條規則,任何x.o文件都從 x.c編譯而來
所以OBJS=(SRCS:.c=.o),SRCS.c.omakefile:CC=gccSRCS=test.cOBJS= (SRCS:.c=.o)
EXEC=test

start:$(OBJS)

    $(CC) -o $(EXEC) $(OBJS) 
    @echo '---------------ok---------------'

$(OBJS):

    $(CC) -o $(OBJS) -c $(SRCS) 

clear:

    rm -rf $(OBJS)

eg8:使用自動變量與模式規則的makefile文件
make定義了一些有用的預定義變量
$@ 規則的目標所對應的文件名
$< 規則中的第一個相關文件名
makefile 文件如下:

.SUFFIXES:.c .o

CC=gcc
SRCS=test.c //這裏可以添加其他.c文件
OBJS=$(SRCS:.c=.o)
EXEC=test

start:$(OBJS)
        $(CC) -o $(EXEC) $(OBJS) 
        @echo '---------------ok---------------'

.c.o:
        $(CC) -o $@ -c $< 

clear:
        rm -f $(OBJS)

三、GDB

gcc -g –o hello hello.c
-g選項就可以在生成的目標代碼中添加調試信息。
啓動gdb
gdb 程序名 [corefile]
corefile是可選的,但能增強gdb的調試能力。
Linux默認是不生成corefile的,需要手動操作
步驟1:cd  //什麼都不加,表示回到當前用戶的宿主目錄
步驟2:ls -al ,vi .bashrc,修改文件在文件的末尾處  添加 ulimit -c unlimited
步驟3:修改完.bashrc文件後記得 . .bashrc   讓修改生效

調試方法一:通過gdb 查看core文件信息
gdb hello core //quit 退出gdb
如果你不喜歡一大堆的軟件信息,可以通過-q參數關閉軟件信息
gdb -q hello core
可以看到gdb通過core告訴你,程序哪條語句出現問題
調試方法二:通過gdb 運行程序1. gdb hello
2.run 命令查看出差信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章