先來想像乙個案例,假設我的可執行檔案裡面包含了四個源**檔案,分別是 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 目標檔案2gcc -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 ~]# makeclean 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 ~]# vimakefile
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 ~]# vimakefile
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 產生發...