linux程式設計 Makefile檔案

2021-04-01 11:53:49 字數 3654 閱讀 7629

linux程式設計——makefile檔案

今天我想說說這個makefile檔案了,makefile檔案?原來在windows平台上我還真沒有弄過這個東東,其實也是有的,只是我們沒有接觸到罷了。

makefile檔案,是個什麼東西?有什麼用?怎麼來寫?這就是我要說的。

我們都清楚,用傳統c、c++語言開發乙個程式,都要經歷這幾個步驟:編輯——編譯——連線,連線成功就可執行了。在windows平台,這幾個步驟都是在開發工具的幫助下自動完成的,所以大家體會不是很深刻。而在linux平台,這個流程需要我們自己來走(這句話說的不是很正確,現在在linux上已經有一些開發工具)。恩,看來makefile檔案與這個流程有關,對,是密切相關。

#include

int main (int argc, char **argv)

#g++ -wall -o2 -c main.cpp

#號是命令提示符,關於g++命令的用法和各個引數的意義請大家參考其它書籍,在這裡不對這個做過多說明。

這條命令執行後,目錄中就多了個main.o檔案了,這個檔案的出現說明了很些問題,對於我們開發者,最關心的乙個問題就是:我們的源**沒有語法錯誤!如果有語法錯誤,那編譯器就會把錯誤資訊列印到終端視窗上,沒的說,去修改**去,修改完了儲存再執行以上命令。

編譯通過了,這可是不小的一步啊,接著就是連線了,執行以下這條命令:

#g++ main.o -o main.exe

這條命令是把main.o連線成mian.exe,在實際專案中,乙個可執行檔案要由很多.o檔案和作業系統提供的其他庫檔案一起連線而成,不象我們這裡這麼簡單。這時目錄中會出現乙個main.exe檔案,檢視該檔案的屬性,可看到它有執行屬性,對了,這就是我們最終想要的可執行檔案了。值得注意的是,這裡的main.exe檔名是任意指定的,系統不會因為我們加個exe字尾就給它賦予執行屬性,也不會因為沒有exe字尾就隨便取消該有的執行屬性。

好了,執行該檔案:

#./main.exe

回車後就可看到列印到終端上的「hello world!」了。

現在我有一些函式放在另乙個檔案中,在main.cpp檔案中要使用這幾個函式,比如說另外的**檔案分別為funtion.h和function.cpp檔案,在main.cpp檔案中要包含funtion.h檔案(#include "function.h"),然後

執行以下命令:

#g++ -wall -o2 -c function.cpp

#g++ -wall -o2 -c main.cpp

當function.o檔案和main.o檔案都存在時,進行連線

#g++ main.o function.o -o main.exe

現在,新的main.exe檔案就連線好了。

如果funtion.h和function.cpp檔案中的內容有改變,那將要重新編譯funtion.o檔案,依賴funtion.h和function.cpp檔案的main.cpp檔案也需要編譯,連線就更需要做了。很煩人的,如果**檔案很多,依賴(包含)關係錯綜複雜,乙個檔案被修改了,哪個.o檔案需要重新編譯,執行編譯操作,再連線,這個工作量單調而且乏味,還容易出錯,操作起來不現實。

怎麼辦?看!makefile檔案出現了,呵呵。

makefile檔案是乙個shell檔案(linux中的叫法,相當與windows中的批處理檔案.bat),它記錄了**檔案之間這種依賴關係,哪個檔案需要重新編譯是由makefile檔案說了算的。

我們先看乙個具體的makefile檔案:

#-----------------------start of makefile------------------------

cc=g++

cflags=-wall -o2 -g -d __debug__

includes=-i.

libs=-lpthread

objs=thread.o crc32.o ts.o tspacketizer.o utils.o socket.o pdg.o test_pdg.o

prog=pdgd

%.o:%.cpp

$(cc) $(cflags) $(includes) -c $<

all: $(prog)

$(prog): $(objs)

$(cc) $(libs) $(objs) -o $(prog)

clean:

rm -f *.o $(prog)

install:

cp ./pdgd /usr/sbin/

cp ./pdg_tester /etc/init.d/

chmod +x /etc/init.d/pdg_tester

#-----------------------end of makefile---------------------------

makefile檔案中以「#」開頭的行相當與注釋,不起作用。

大概做一下解釋:

cc=g++ 表示使用的編譯器為g++;

cflags=-wall -o2 指定編譯行為,-o2表示**優化程度為中等;-g表示可除錯,相當於windows中的debug版本,-d和後面的引數表示定義了乙個巨集;

includes=-i.  表示源**都放在哪些目錄中,-i.表示本目錄,如果本目錄下還有個soc的目錄,則這句要寫成includes=-i. -i./soc;

libs=-lpthread   表示在連線時使用系統提供的連線庫,上面的工程中引入了多執行緒,所以要使用系統提供的lpthread連線庫;

objs=thread.o crc32.o ts.o tspacketizer.o utils.o socket.o pdg.o test_pdg.o

表示我們要編譯的各個.o檔案,如果是我們前面的那個例子,要寫成objs=function.o main.o;

prog=pdgd  指定連線目標檔名,象我們上面的main.exe一樣;

%.o:%.cpp  表示.o檔案依賴於.cpp檔案,這就是我們那個依賴關係;

$(cc) $(cflags) $(includes) -c $<

上面這句才是真正進行編譯的語句,在這句前面一定要留有空白(tab鍵或空格),原因是這是乙個執行語句,詳細情況我也不是很清楚,不好意思;

$(prog): $(objs) 表示目標檔案依賴於.o檔案;

$(cc) $(libs) $(objs) -o $(prog)

這句是連線語句,前面要留空白。

再下面的clean:和install:不是必須的,它們是makefile檔案可有的,稱做標記。

恩,好,那這個檔案如何使用呢?

1、先寫這個檔案,儲存在源**所在目錄;

2、執行命令:

#make

回車,哦,很自動的,我們一開始說道的編譯呀,連線呀,都自動做了,上面提到在makefile檔案中有個稱做標記的東東,只輸入make 不會執行任何標記下的語句,如果想執行哪個標記的內容,使用以下命令:

#make 標記名

如上面的:#make clean和#make install。

makefile檔案根據**檔案的修改時間和上次編譯時的時間判定哪個檔案進行了修改,從而決定重新編譯哪個檔案,還有根據依賴關係決定那些檔案雖然沒有被修改但所依賴的檔案被修改而也需要重新進行編譯,所以是又省時又省力,值得採用。

關於makefile檔案我也就會這些了,寫出來大家一起進步。前幾天看到乙個系統的makefile檔案,哇塞,嚇我一跳,太複雜了,看來這makefile檔案也是博大精深的,路還長著呢,好好努力吧。

linux程式設計 makefile檔案

今天我想說說這個makefile檔案了,makefile檔案?可能是我孤陋寡聞吧,原來在windows平台上我還真沒有聽說過這個東東,其實也是有的,只是我們沒有接觸到罷了。makefile檔案,是個什麼東西?有什麼用?怎麼來寫?這就是我要說的。我們都清楚,用傳統c c 語言開發乙個程式,都要經歷這幾...

Linux程式設計 Makefile 使用

在先前的文章中,我們已經學習了 gcc 和 gdb 的使用。本節,我們將介紹 makefile 的使用。makefile帶來的好處就是 自動化編譯 一但寫好,只需要乙個 make 命令,整個工程便可以完全編譯,極大的提高了軟體的開發效率 特別是對於那些專案較大 檔案較多的工程 make是乙個命令工具...

linux程式設計工具makefile

linux中對大量的工程檔案進行編譯,通常利用make工具來自動完成編譯,make工具通過乙個makefile makefile 檔案來完成自動維護編譯工作。makefile基本規則 分為三部分 target dependencies tab鍵 command 目標 target 需要生成的目標檔案...