程式例子是簡單的hello world!
生成可執行檔案
命令:#gcc hello.c -o hello
執行程式
#./hello 螢幕即顯示hello world!
gcc編譯器選項
-o選項,表示輸出的可執行檔案。
-c選項表示只輸出目標**,而不必輸出可執行檔案。
-g選項表示要求編譯器在編譯的時候提供對程式的除錯資訊。
例如:#gcc -c test1.c //將test1.c編譯成test1.o
#gcc -c test2.c //將test2.c編譯成test2.o
#gcc -o test test1.o test2.o //將test1.o和test2.o鏈結成可執行檔案test
gdb簡介
gdb是gnu發布的一款功能強大的程式除錯工具。gdb主要完成下面三方面的功能:
1、啟動被除錯程式。
2、讓被除錯的程式在指定的位置停住。
3、當程式被停住時,可以檢查程式狀態(如變數值)。
程式例子:起步(tst.c)
#include void main()printf("result = %d\n",result);
}
gdb快速高階
1、編譯生成可執行檔案:
gcc -g tst.c -o tst
2、啟動gdb
gdb tst
3、在main函式處設定斷點
break main
4、執行程式
run5、單步執行
next
6、繼續執行
continue
啟動gdb
1、gdb除錯程式名
例: gdb helloworld
2、gdb
file 除錯程式名
gdb命令
list(l)檢視程式
break(b)函式名在某函式入口處新增斷點
break(b)行號在指定行新增斷點
break(b)檔名:行號在指定檔案的指定行新增斷點
break(b)行號if條件當條件為真時,指定行號處斷點生效,例b 5 if i=10,當i等於10第5行斷點生效
info break檢視所有設定的斷點
delete斷點編號刪除斷點
run(r)開始執行程式
next(n)單步執行程式(不進入子函式)
step(s)單步執行程式(進入子函式)
continue(c)繼續執行程式
print(p)變數名檢視指定變數值
finish執行程式,直到當前函式結束
watch變數名對指定變數進行監控
quit(q)退出gdb
make與makefile基礎
在大型的開發專案中,通常有幾十個到上百個的原始檔,如果每次均手工鍵入gcc命令進行編譯,會非常不方便。
linux專門為軟體開發提供了乙個自動化的管理工具gnu make。
make可以自動地更新和編譯程式。make將整個軟體專案的**分開在幾個小的原始檔裡,在改動其中乙個檔案的時候,可以只對該檔案重新進行編譯,然後重新連線所有的目標檔案。
make依靠makefile檔案完成。
在linux系統中,習慣使用makefile作為makefile檔案。如果要使用其他檔案作為makefile,則可利用下面make命令指令makefile檔案:
#make -f makefile.debug
makefile是乙個文字格式的資料庫檔案,包含一些規則,告訴make編譯哪些檔案,在什麼條件下編譯。
makefile的宗旨就是:讓編譯器知道要編譯乙個檔案需要依賴其他的哪些檔案。當那些依賴檔案有了改變,編譯器會自動的發現最終的生成檔案已經過時,而重新編譯相應的模組。
makefile帶來的好處就是—―自動化編譯」,一旦寫好,只需要乙個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。
make命令格式:
make [-f makefile] [option] [target]
#make target
#make
#make clean
makefile的格式
target ... :dependencies ...
command
target也就是乙個目標檔案,可以是object file,也可以是執行檔案。還可以是乙個標籤(label)。
dependencies就是,要生成那個target所需要的檔案或是目標。
command也就是make需要執行的命令。(任意的shell命令,可以有若干行)
command必須以tab鍵開頭。否則,make就會顯示出錯資訊。如果某一命令列太長可以分作兩行,用反斜槓(\)連線
make的工作流程
1、make會在當前目錄下找名字為「makefile」 或「makefile」的檔案。
2、如果找到,它會找檔案中的第乙個目標檔案(target),並將這個檔案作為最終的目標檔案。
3、如果目標檔案不存在或目標檔案所依賴的檔案修改時間比目標檔案新,那麼就執行後面定義的命令,來生成這個目標檔案。
4、如果目標檔案所依賴的檔案也存在,那麼make會在當前檔案中找目標檔案的依賴性,如果找到則再根據那乙個規則生成所依賴的檔案。
5、make會一層又一層地找檔案的依賴關係,直到最終編譯出第乙個目標檔案。
乙個簡單的例子edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
…………
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
makefile中使用變數
在makefile中定義的變數,就像是c/c++語言中的巨集一樣,他代表了乙個文字字串,在makefile中執行的時候其會自動原模原樣地展開在所使用的地方。
變數的命名字可以包含字元、數字,下劃線(可以是數字開頭),但不應該含有「:」、 「#」、「=」或是空字元(空格、回車等)。
變數是大小寫敏感的,「foo」、「foo」和「foo」是三個不同的變數名。
變數在宣告時需要給予初值,而在使用時,需要給在變數名前加上「$」符號,但最好用小括號「()」或是大括號「{}」把變數給包括起來。
使用變數的makefileobjects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
。。。。。。
。。。。。。
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)
make自動推導
只要make看到乙個[.o]檔案
它就會自動的把[.c]檔案加在依賴關係中,如果make找到乙個whatever.o,那麼whatever.c,就會是whatever.o的依賴檔案
並且 cc -c whatever.c 也會被推導出來
於是,我們的makefile再也不用寫得這麼複雜。
最終可以變成objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.phony : clean
clean :
rm edit $(objects) 「.phony」表示,clean是個偽目標檔案。
Linux下的C語言開發
學會使用vim emacs,vim emacs是linux下最常用的原始碼編輯具,不光要學會用它們編輯原始碼,還要學會用它們進行查詢 定位 替換等。學會makefile檔案的編寫規則,並結合使用工具aclocal autoconf和automake生成makefile檔案。掌握gcc和gdb的基本用...
linux下的C語言開發(makefile編寫)
標籤 makefile linux語言c 工具測試 2012 01 12 18 22 22628人閱讀收藏 舉報 linux開發 16 作者同類文章x 首先編寫add.c檔案,cpp view plain copy print?include test.h include int add int a...
Linux基礎入門 C語言開發環境
1 linux具備現在一切功能完整的unix系統所具備的全部特徵,其中包括真正的多工虛擬記憶體,共享庫,需求裝載,優秀的記憶體管理以及tcp ip網路支援等。2 linux的發行遵守gnu的通用公共許可證 gpl 3 相容絕大部分的unix標準 如ieee posix 遵從posix規範 標準主要有...