深入學習Make命令和Makefile(下) 1

2021-06-21 16:22:07 字數 2745 閱讀 9251



一、構建多個目標

有時候,我們想要在乙個makefile中生成多個單獨的目標檔案,或者將多個命令放在一起,比如,在下面的示例mymakefile3中我們將新增乙個clean 選項來清除不需要的目標檔案,然後用install選項將生成的應用程式移動到另乙個目錄中去。這個makefile跟前面的mymakefile較為相似,不同之處筆者用黑體加以標識:

all: main

# 使用的編譯器

cc = gcc

# 安裝位置

instdir = /usr/local/bin

# include檔案所在位置

include = .

# 開發過程中所用的選項

cflags = -g -wall –ansi

# 發行時用的選項

# cflags = -o -wall –ansi

main: main.o f1.o f2.o

$(cc) -o main main.o f1.o f2.o

main.o: main.c def1.h

$(cc) -i$(include) $(cflags) -c main.c

f1.o: f1.c def1.h def2.h

$(cc) -i$(include) $(cflags) -c f1.c

f2.o: f2.c def2.h def3.h

$(cc) -i$(include) $(cflags) -c f2.c

clean:

-rm main.o f1.o f2.o

install: main

@if [ -d $(instdir) ]; \

then \

cp main $(instdir);\

chmod a+x $(instdir)/main;\

chmod og-w $(instdir)/main;\

echo 「installed in $(instdir)「;\

else \

echo 「sorry, $(instdir) does not exist」;\

fi在這個makefile中需要注意的是,雖然這裡有乙個特殊的目標all,但是最終還是將main作為目標。因此,如果執行make命令時沒有在命令列中給出乙個特定目標的話,仍然會編譯連線main程式。

其次要注意後面的兩個目標:clean和install。目標clean沒有依賴模組,因為沒有時間標記可供比較,所以它總被執行;它的實際意圖是引出後面的rm命令來刪除某些目標檔案。我們看到rm命令以-開頭,這時即使表示make將忽略命令結果,所以即使沒有目標供rm命令刪除而返回錯誤時,make clean依然繼續向下執行。

接下來的目標install依賴於main,所以make知道必須在執行安裝命令前先建立main。用於安裝的指令由一些shell命令組成。

因為make呼叫shell來執行規則,並且為每條規則生成乙個新的shell,所以要用乙個shell來執行這些命令的話,必須新增反斜槓,以使所有命令位於同乙個邏輯行上。這條命令用@開頭,表示在執行規則前不會向標準輸出列印命令。

為了安裝應用程式,目標install會一條接一條地執行若干命令,並且執行下乙個之前,不會檢查上一條命令是否成功。若想只有當前面的命令取得成功時,隨後的命令才得以執行的話,可以在命令中加入&&,如下所示:

@if [ -d $(instdir) ]; \

then \

cp main $(instdir) &&\

chmod a+x $(instdir)/main && \

chmod og-w $(instdir/main && \

echo 「installed in $(instdir)「 ;\

else \

echo 「sorry, $(instdir) does not exist」 ; false ; \fi

這是shell的「與」指令,只有當在前的命令成功時隨後的命令才被執行。這裡不必關心前面命令是否取得成功,只需注意這種用法就可以了。

要想在/usr /local/bin目錄安裝新命令必須具有特權,所以呼叫make install命令之前,可以讓makefile使用乙個不同的安裝目錄,或者修改該目錄的許可權,或切換到root使用者。如下所示:

$ rm *.o main

$ make -f mymakefile3

gcc -i. -g -wall -ansi -c main.c

gcc -i. -g -wall -ansi -c f1.c

gcc -i. -g -wall -ansi -c f2.c

gcc -o main main.o f1.o f2.o

$ make -f mymakefile3

make: nothing to be done for 『all』.

$ rm main

$ make -f mymakefile3 install

gcc -o main main.o f1.o f2.o

installed in /usr/local/bin

$ make -f mymakefile3 clean

rm main.o f1.o f2.o

$讓我們對此作一簡單介紹,首先刪除main和所有目標檔案程式,由於將all作為目標,所以make命令會重新編譯main。當我們再次執行make命令時,由於main是最新的,所以make什麼也不做。之後,我們刪除main程式檔案,並執行make install,這會重新建立二進位制檔案main並將其複製到安裝目錄。最後,執行make clean命令,來刪去所有目標程式。

深入學習Make命令和Makefile(上)(1)

make是linux下的一款程式自動維護工具,配合makefile的使用,就能夠根據程式中模組的修改情況,自動判斷應該對那些模組重新編譯,從而保證軟體是由最新的模組構成。本文分為上下兩部分,我們將緊緊圍繞make在軟體開發中的應用展開詳細的介紹。深入學習make命令和makefile 下 一 都是原...

深入學習Make命令和Makefile(上) 3

五 makefile中的規則 除了指明目標和模組之間的依賴關係之外,makefile還要規定相應的規則來描述如何生成目標,或者說使用哪些命令來根據依賴模組產生目標。就上例而言,當make程式發現需要重新構建f1.o的時候,該使用哪些命令來完成呢?很遺憾,到目前為止,雖然make知道哪些檔案需要更新,...

深入學習Make命令和Makefile(下) 3

三 字尾規則 前面我們已經看到,有些內部規則會根據檔案的字尾 相當於windows系統中的副檔名 來採取相應的處理。換句話說,這樣當make見到帶有一種字尾的檔案時,就知道使用哪些規則來建立乙個帶有另外一種字尾的檔案,最常見的是用以.c結尾的檔案來建立以.o結尾的檔案,即把原始檔編譯成目標程式,但是...