Linux下的C的開發之GCC的初級使用

<span style="font-family: Arial, Helvetica, sans-serif; "><span style="white-space:pre">	</span>Linux下的C開發,可能與win平臺的C有點不太同樣,但可能不太多,遇到再說吧,咱們今天要說的就是GCC的使用技巧(初級的),徹底菜鳥級的!!</span>

不少人的感受,特別是離開win平臺,到Linux平臺寫C代碼的時候,熟練VIM編輯器以後,最初寫代碼的感受多是。。。。沒啥不同。或 者感受也沒有傳說中那麼神祕,沒錯,我當初也是這個感受,其實那是由於會的東西太少。。就拿GCC這個來講,有多少菜鳥用的很熟練?用熟練了,就不會用上 面所說的感受了,只會說同一個字:爽linux

直接上例子,具體代碼不想寫太多,由於我也是從別人的代碼中拿來的。。。本身作一個總結而已shell

例如,咱們寫一個main方法,要實現比較兩個整數的大小,分別有兩個方法供調用,分別是max(int a,int b)和min(int a,int b),最初的模式,咱們通常是把這幾個方法寫到同一個.c文件中,這個沒錯,可是若是咱們有上千萬個這種方法讓你調用,你都要本身寫到一個文件中?確定不 合適,最好的方法就是這麼多的方法,是來自各個不一樣人寫的,放在不一樣的文件中,多是一個方法一個文件,這樣單列的,那麼咱們怎樣才能經過gcc調用這些 方法呢?編程

例如,有min.c,max.c和一個主方法文件hello.c
首先。。
gcc -c max.c
gcc -c min.c
或者:gcc -c max.c min.c
沒有錯誤的話,會產生:
max.o,min.o這兩個文件
而後:
gcc max.o min.o hello.c -o hello.out
產生hello.out文件(沒錯誤的前提下)
最後:./hello.out 
輸出結果

把這個情景腦補成有幾萬個方法文件。。。光編譯也會煩死,弄很差出錯了,再重來。。。那麼問題來了,怎麼辦?那就是make工具,這個工具很強 大,強大到我只會用一部分功能,尚未達到哪裏不爽改哪裏的境界。。好吧,怎麼用呢?那就是先定義規則,再make,規則在哪裏定義?在Makefile 文件中,怎麼寫規則呢?編輯器

很簡單,目標:依賴,下一行TAB縮進以後加命令ide

 

#this is makefile
hello.out:max.o min.o hello.c<TAB>gcc max.o min.o hello.c -o hello.out
max.o:max.c<TAB>gcc -c max.c
min.o:min.c<TAB>gcc -c min.c

這就是Makefile文件的內容,而後咱們直接shell中執行make命令便可,就能夠按照這個規則執行了,那麼在第三行中,可能有個問題,就是若是仍是有幾萬個文件讓你寫上去,豈不是很麻煩?固然有簡單的辦法。。。Linux就是爲懶人設計的。。。改爲函數

#this is makefile
hello.out:max.o min.o hello.c<TAB>gcc $^ -o $@
max.o:max.c<TAB>gcc -c max.c
min.o:min.c<TAB>gcc -c min.c

注意到變化了嗎?$^表示全部依賴,就是指的各類.o文件,$@就是指的目標文件,就那麼一個,就是上面的hello.out,最會也是 make執行便可,這裏的好處是簡化了用戶輸入的複雜性,還有個好處,就是每次更改一個文件的時候,只要.o文件存在,就不會重複編譯,從而提升了效率。工具

順便提一下Linux的管道,咱們知道Linux的IPC(進程間通訊)機制主要有:信號,管道,IO重定向,share內存和套接字等,咱們 常用的就是管道和IO重定向,管道就是「|」,這個豎槓就是管道,重定向就是「>,<,>>,<<」這些符 號,「>」和">>"的區別是,一個是覆蓋的,另外一個是追加到文件後面的,仍是說管道,咱們寫程序的時候,會碰到一種狀況,就是上一個 函數的輸出就是下個函數的輸入,這種狀況若是還要從新編程的話,時間效率不高,管道就提供了個很好的方法,可是必定要注意輸入和輸出啊,起碼要保證類型和 數量是一致的才能用,例如,一個avg方法統計平均數(須要輸入總和與個數),一個sum方法會根據輸入統計出總和和個數,可是這兩個方法是來自兩個不一樣 文件的,也就是說最後產生的可執行文件是:avg.out和sum.out(也能夠本身定義其餘名字,這裏只是舉例說明),咱們想要把sum中的輸出直接 放到avg的輸入中,怎麼辦?管道來辦,具體方法是命令行輸入:./sum.out | ./avg.out,ok執行(這倆文件要放到一個目錄裏。),就這麼簡單。。想當初我也不會。。。我傻傻的人工輸入。。。後來聰明瞭,寫了個腳本,採集 輸出而後按照格式解析出來,再傳到目標函數中,尼瑪都是不會用管道惹的禍。學習

後面還要實踐gdb和ddd等工具的使用,慢慢學吧,一塊兒加油。this

相關文章
相關標籤/搜索