一、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=
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 命令查看出差信息