作為初學者,我很享受和在意學到的每一點知識,寫下這入門級的文章,主要是記載自己的點點滴滴,為10年後的自己尋找回憶的時候留下一條線索,如果能夠幫助到一些新學習Linux的同學,那是最好不過的了!
Ubuntu 下,不用IDE開發,在GNU下進行編譯和調試的話只能輸入命令來進行,雖然挺繁瑣,但是效率真的很快的,並且在終端下輸入命令感覺很牛牛的樣子。
GNU是GUN‘s not unix的遞歸所寫,呵呵,感覺這個很有意思。GNU本來是一個大牛發起的一項發展自由操作系統,自由軟件的運動。gcc是GNU C語言編譯器,後來發展可以進行C++的編譯了,成為GNU compiler collection的縮寫。這是簡單的歷史和背景,因為我們要用gcc去編譯我們的c程序
編譯的時候首先要進入到你的c文件所在的那個目錄,不然找不到原文件,通過ls命令可以察看當前目錄下的文件
一:編譯單C文件
gcc text.c 會默認產生a.out文件,即默認的目標代碼文件
gcc -c text.c 會產生和源文件同名的目標文件即:text.o
gcc text.c -o liu 產生名為liu的可執行文件 或者 gcc -o liu text.c ./liu就可以執行程序了
二:用到非系統默認類庫
比如用到多線程類庫pthread
gcc text.c -o liu -lpthread 或者gcc -o liu text.c -lpthread -lpthread一定放在最後面,即,在-l後面加上你要用到的類庫
三:多個源文件進行編譯,即 makefile 的編寫或者Makefile
makefile的好處是防止源文件的重復編譯
比如有好多個源文件,某天對其中一個源文件進行修改,如果不寫makefile的話,需要將整個工程的所有文件重新編譯一遍,非常麻煩,有了makefile,說明了每個源文件的依附關系,當某個源文件改變的時候只需重新編譯一下關聯的源文件就好。
例如:有以下文件
one.h
one.c
two.h
two.c
main.c
main.c 中引入one.h 和two.h兩個頭文件,one.c two.c 分別實現兩個頭文件中定義的函數
有兩種方式編譯運行該程序,
一:手動單獨編譯
gcc -c one.c
gcc -c two.c
gcc -c main.c
gcc -o main main.o one.o two.o
./main
二:makefile
那麼只需在任何一個文本編輯器裡面寫下如下命令,並保存為makefile
main:main.o one.o two.o
tab鍵gcc(或者cc)-o main main.o one.o two.o
main.o:main.c one.h two.h
tab鍵gcc(或者cc)-c main.c
one.o:one.c one.h
tab鍵gcc(或者cc)-c one.c
two.o:two.c two.h
tab鍵gcc(或者cc)-c two.c
這些源文件都需要在同一個目錄下,並且在main.c中引入one.h 和two.h的時候要用"one.h" "two.h"不要用<>否則編譯器會到系統類庫文件中去找,是找不到的。
然後在同一目錄的終端下,輸入make命令,那麼編譯就開始了,沒有什麼錯誤的話,執行./main就可以讓你的程序跑起來了。
還可以對makefile進行精簡:
首先有三個符號:
1 $@ 代表目標文件
2 $< 代表第一個文件
3$^ 代表所有依賴文件
所以上面命令可以精簡為:
main:main.o one.o two.o
tab鍵gcc(或者cc)-o $@ $^
main.o:main.c one.h two.h
tab鍵gcc(或者cc)-c $<
one.o:one.c one.h
tab鍵gcc(或者cc)-c $<
two.o:two.c two.h
tab鍵gcc(或者cc)-c $<
以上makefile還可以精簡:
一個新的符號:.c.o
該符號自動搜索相關聯的源文件和頭文件
於是makefile還可以寫為:
main:main.o one.o two.o
tab鍵gcc(或者cc)-o $@ $^
.c.o:
tab鍵gcc(或者cc) $<
最好在加上clean命令,將生成的目標文件和執行文件刪除,遵守優雅簡潔原則,呵呵,方便再次編譯
clean:
ab鍵gcc(或者cc)rm main main.o one.o two.o
makefile的格式大家要記住了,至於問什麼這樣寫,只能說這是標准,makefile還有很多高深的用法,以後在逐漸去學習。
Ok,不對的地方大家請指正,有疑問的地方請留言。