make命令使用 makefile編寫詳解

2022-06-26 07:57:12 字數 4851 閱讀 3831

先來想像乙個案例,假設我的可執行檔案裡面包含了四個源**檔案,分別是 main.c haha.c sin_value.c cos_value.c 這四個檔案,這四個檔案的目的是:

main.c :主要的目的是讓使用者輸入角度資料與呼叫其他三支副程式;

haha.c :輸出一堆有的沒有的訊息而已;

sin_value.c :計算使用者輸入的角度(360) sin 數值;

cos_value.c :計算使用者輸入的角度(360) cos 數值。

這四個檔案你可以到

那麼就需要這樣編譯:

# 1. 先進行目標檔案的編譯,最終會有四個 *.o 的檔名出現:

[root@study ~]# gcc -c main.c

[root@study ~]# gcc -c haha.c

[root@study ~]# gcc -c sin_value.c

[root@study ~]# gcc -c cos_value.c# 2

[root@study ~]# gcc -o main main.o haha.o sin_value.o cos_value.o -lm

# 3. 本程式的執行結果,必須輸入姓名、360

度角的角度值來計算:

[root@study ~]# ./main

please input your name: vbird

<==這裡先輸入名字

please enter the degree angle (ex> 90): 30

<==輸入以 360

度角為主的角度

hi, dear vbird,

nice to meet you. <==這三行為輸出的結果喔!

the sin is:

0.50

the cos is:

0.87

編譯的過程需要進行好多動作啊!而且如果要重新編譯,則上述的流程得要重新來一遍,光是找出這些指令就夠煩人的了!

如果可以的話,能不能乙個步驟就給他完成上面所有的動作呢?那就利用 make 這個工具吧!

先試看看在這個目錄下建立乙個名為 makefile 的檔案,內容如下:

# 1

. 先編輯 makefile 這個規則檔,內容只要作出 main 這個可執行檔案

[root@study ~]# vim makefile

main: main.o haha.o sin_value.o cos_value.o

gcc -o main main.o haha.o sin_value.o cos_value.o -lm

# 注意:第二行的

gcc 之前是 按鍵產生的空格喔!# 2

. 嘗試使用 makefile 制訂的規則進行編譯的行為:

[root@study ~]# rm -f main *.o <==先將之前的目標檔案去除

[root@study ~]# make

cc -c -o main.o main.c

cc -c -o haha.o haha.c

cc -c -o sin_value.o sin_value.c

cc -c -o cos_value.o cos_value.c

gcc -o main main.o haha.o sin_value.o cos_value.o -lm

# 此時

make

會去讀取 makefile 的內容,並根據內容直接去給他編譯相關的檔案囉!# 3

. 在不刪除任何檔案的情況下,重新執行一次編譯的動作:

[root@study ~]# make

make: `main'

is up to date.

# 看到了吧!是否很方便呢!只會進行更新 (update) 的動作而已。

如此一來,將可大大的節省很多編譯的時間,要知道,某些程式在進行編譯的行為時,會消耗很多的 cpu

資源呢!所以說, make 有這些好處:

基本的 makefile 規則是這樣的:標的(di四聲)

標的(target): 目標檔案1 目標檔案2

gcc -o 欲建立的可執行檔案 目標檔案1 目標檔案2

那個標的

(target)

就是我們想要建立的資訊,而目標檔案就是具有相關性的 object files ,那建立可執行檔案的語法就是以

按鍵開頭的那一行!特別給他留意喔,「命令列必須要以 tab 按鍵作為開頭」才行!他的規則基本上是這樣:

同樣的,我們以剛剛上乙個小節的範例進一步說明,如果我想要有兩個以上的執行動作時,

例如下達乙個指令就直接清除掉所有的目標檔案與可執行檔案,該如何製作呢?

# 1

[root@study ~]# vi

makefile

main: main.o haha.o sin_value.o cos_value.o

gcc -o main main.o haha.o sin_value.o cos_value.o -lm

clean:

rm -f main main.o haha.o sin_value.o cos_value.o

# 2. 以新的標的 (clean) 測試看看執行 make

的結果:

[root@study ~]# make clean <==就是這裡!通過 make

以 clean 為標的

rm -rf main main.o haha.o sin_value.o cos_value.o

如此一來,我們的 makefile 裡面就具有至少兩個標的,分別是 main 與 clean ,如果我們想要建立 main 的話,輸入「make main」,如果想要清除有的沒的,輸入「make clean」即可啊!而如果想要先清除目標檔案再編譯 main 這個程式的話,就可以這樣輸入:「make clean main」,如下所示:

[root@study ~]# make

clean main

rm -rf main main.o haha.o sin_value.o cos_value.o

cc -c -o main.o main.c

cc -c -o haha.o haha.c

cc -c -o sin_value.o sin_value.c

cc -c -o cos_value.o cos_value.c

gcc -o main main.o haha.o sin_value.o cos_value.o -lm

這樣就很清楚了吧!但是,你是否會覺得,咦! makefile 裡面怎麼重複的資料這麼多啊!沒錯!所以我們可以再借由 shell script 那時學到的「變數」來更簡化 makefile 喔:

[root@study ~]# vi

makefile

libs = -lm

objs =main.o haha.o sin_value.o cos_value.o

main: $

gcc -o main $ $

clean:

rm -f main $

與 bash shell script 的語法有點不太相同,變數的基本語法為:

1. 變數與變數內容以「=」隔開,同時兩邊可以具有空格;

2. 變數左邊不可以有

,例如上面範例的第一行 libs 左邊不可以是

;3. 變數與變數內容在「=」兩邊不能具有「:」;

4. 在習慣上,變數最好是以「大寫字母」為主;

5. 運用變數時,以 $ 或 $(變數)

使用;6. 在該 shell 的環境變數是可以**用的,例如提到的 cflags 這個變數!

7. 在指令列模式也可以給予變數。

由於 gcc 在進行編譯的行為時,會主動的去讀取 cflags 這個環境變數,所以,你可以直接在 shell 定義出這個環境變數,也可以在makefile 檔案裡面去定義,更可以在指令列當中給予這個咚咚呢!例如:

[root@study ~]# cflags="

-wall

"make

clean main

# 這個動作在上

make

進行編譯時,會去取用 cflags 的變數內容!

也可以這樣:

[root@study ~]# vi

makefile

libs = -lm

objs =main.o haha.o sin_value.o cos_value.o

cflags = -wall

main: $

gcc -o main $ $

clean:

rm -f main $

咦!我可以利用指令列進行環境變數的輸入,也可以在檔案內直接指定環境變數,那萬一這個 cflags 的內容在指令列與 makefile 裡面並不相同時,以那個方式輸入的為主?呵呵!問了個好問題啊!

環境變數取用的規則是這樣的:

1. make 指令列後面加上的環境變數為優先;

2. makefile 裡面指定的環境變數第二;

3. shell 原本具有的環境變數第三。

此外,還有一些特殊的變數需要了解的喔:

所以我也可以將 makefile 改成:

[root@study ~]# vi

makefile

libs = -lm

objs =main.o haha.o sin_value.o cos_value.o

cflags = -wall

main: $

gcc -o $@ $ $ <==那個 $@ 就是 main !

clean:

rm -f main $

over......

使用autotools生成makefile

接下來就要正式步驟 1,autoscan 生成了一乙個configure.scan檔案。編輯它,增加巨集宣告 am init automake hello,1.0 和ac config files makefile 然後儲存為configure.ac。其實configure.scan就是乙個模板。p...

make命令 clean命令

先先看一下什麼是makefile makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell指令碼一樣,其中也可以執行作業系統的命令。makefile帶來的好處就是 自動化編譯 一旦寫好...

make相關命令

make 根據makefile編譯源 連線,生成目標檔案,可執行檔案。make clean 清除make命令所產生的object檔案 字尾為 o 的檔案 及可執行檔案。make install 將編譯成功的可執行檔案安裝到系統目錄中,一般為 usr local bin目錄。make dist 產生發...