一個簡單的Linux下編程例子

程序猿平時寫的程序文件,比如C,或者Java的文件,叫做源文件。而電腦上能運行的軟件,比如windows下的exe文件,叫做可執(zhí)行文件。源文件不能直接變成可執(zhí)行文件,要經(jīng)過一個中間階段,叫做點o文件(就是后綴名是.o的文件)。點o文件在windows下編程的時候我們是感覺不到的,因為windows下的編程環(huán)境,如visualstudio,會自動處理,替我們生成了.o文件,然后再自動生成exe文件,windows下編程只需要點一下按鈕就完成了源文件到可執(zhí)行文件的轉(zhuǎn)變。

Linux下沒有visualstudio這么厲害的編程工具,所以得自己操心這些細(xì)節(jié)。Linux下,程序員要指明從源文件怎么生成.o文件,然后從.o文件怎么生成可執(zhí)行文件。這些規(guī)矩,都要寫在一個叫做Makefile的文件里。

舉個栗子,下面是一個完整的工程,ls命令看一下,有個叫做Makefile的文件:


在上面的例子中,所有的.o都是生成的中間文件,.cpp是C++的源文件,.h是C++的頭文件,.cu是在GPU上執(zhí)行的文件,gch是臨時文件。

現(xiàn)在我們該打開一個文件看看里面的內(nèi)容,先打開Makefile看看。Linux下,編輯文件的命令叫做vim。輸入vimMakefile:


Makefile文件分成兩部分,開頭是變量定義,意思是說有些特別長的字符串,程序猿懶得每回都重寫一遍,所以給他們重起個名字,以后用的時候用名字來代替就行。比如上面的例子中CC就是/usr/local/gcc481/bin/g++的名字。以后要用的時候,需要一個在美元符號后用花括號括起來,比如${CC}。上面那個栗子的前五行都是變量定義。

Makefile的第二部分是編譯規(guī)則定義,定義的順序跟真正執(zhí)行的順序是反著的,比如最后一步才是把所有的.o文件合并成可執(zhí)行文件main,但在Makefile里要寫在第一條,之后才解釋各個.o文件是怎么生成的。每一個生成規(guī)則由兩行組成。比如這個,表示要生成一個叫Sampl.o的文件:


第一行叫依賴關(guān)系,表示生成這個.o文件的時候,需要用到哪些別的文件,這里要用到Sample.cpp和Sample.h。第二行是編譯規(guī)則,大家還記得變量CC的定義吧,他其實是指用存放在/usr/local/gcc481/bin這個文件夾下面的g++編譯器的。所以這句話的意思是:用存放在/usr/local/gcc481/bin的g++編譯器,把Sample.cpp和Sample.h兩個文件,以–c為參數(shù)編譯成一個.o文件。(-c是參數(shù),意思是啥后面解釋)。clean是一個比較特殊的“虛擬文件”,它的作用是,按照你的規(guī)定,清理掉一些中間文件,這就跟平時干完活了打掃衛(wèi)生一樣。

在本文的栗子里,clean“文件”把.o文件,.gch文件,和最終生成的可執(zhí)行文件main都清理掉(放心,clean需要主動調(diào)用才會工作,所以不用擔(dān)心它自動把可執(zhí)行文件main刪掉了,感覺跟白忙一場似的)。說到這里大家應(yīng)該能大概明白Makefile的組成了。Makefile的東西其實很多,網(wǎng)上有一篇經(jīng)典《跟我一起學(xué)makefile》,解釋的很清楚,感興趣的話可以搜搜看。

現(xiàn)在我們退出剛才用vim打開的Makefile,退出方法是先按Esc,然后“shift”和“;”鍵一起按,然后按q,回車。把“shift”和“;”鍵一起按下之后,窗口的最下面一行會清空,第一個字符變成“:”,表示等待進一步輸入的意思。

現(xiàn)在輸入make試試看結(jié)果。Make命令表示按照Makefile的要求,生成可執(zhí)行文件。屏幕上會顯示好幾句話,里面的每句話都表示執(zhí)行Makefile里的一條指令。如果程序有錯誤,或者有警告,都會在這里顯示。下面就是執(zhí)行栗子中Makefile的結(jié)果:


前五行,每行都是生成一個.o文件

其中前四行,用的是g++編譯器,第五行用的是nvcc編譯器(nvcc是編譯GPU程序的編譯器)

在用nvcc編譯器編譯Relief.cu文件的時候,系統(tǒng)發(fā)現(xiàn)了五個warning,這是GPU編程里的一個問題,不會影響程序正常運行,我們以后有空再解釋它。最后一行是使用前面產(chǎn)生的.o文件,生成一個可執(zhí)行文件main。

為了運行可執(zhí)行文件,輸入./main命令。(點-斜杠-main,一個都不能少),這表示運行程序,中間要停頓幾秒鐘,執(zhí)行程序。輸入完之后回車,然后系統(tǒng)會停頓幾秒~

現(xiàn)在輸入make clean,表示運行剛才Makfile里面的clean虛擬文件。結(jié)果是三類文件已經(jīng)被刪除了。


Linux下編程基本就是這個樣子,基本順序是寫好各個文件->寫好Makefile>用make命令生成可執(zhí)行文件->運行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容