$mv makefile Makefile
$make
gcc -c main.c
gcc -c liu.c
gcc -c generatedatafile.c
gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz
rm -f *.o
Makefile文件格式
<Target 1>: depend <command 1> <command 2> |
Makefile文件格式--------以小節(rule)爲基本結構
$cat Makefile LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz all: liu clean all depend 兩個小節 liu: main.o liu.o generatedatafile.o liu depend 三個小節 gcc -g $? -o $@ $(LIBS) main.o: main.c gcc -c $? 之前一定要有一個TAB(即TAB鍵) liu.o: liu.c gcc -c liu.c generatedatafile.o: generatedatafile.c gcc -c $? clean: $(RM) *.o |
命令行必須用TAB,不能用一串空格
TAB是command行的標誌
[macg@localhost mysqltmp]$ more makefile liu: main.o liu.o generatedatafile.o gcc -g main.o liu.o generatedatafile.o -o liu -L /usr/lib/mysql -l mysqlclient -lz main.o: main.c comm.h gcc -c main.c liu.o: liu.c /usr/include/mysql/mysql.h gcc -c liu.c generatedatafile.o: generatedatafile.c gcc -c generatedatafile.c |
只make單個小節
$make main.o gcc -c main.c |
main.o: main.c gcc -c $? |
#cat Makefile … install: … clean: … |
小節menu化
小節引用,直接在寫在depend處
$vi Makefile LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz liu: main.o liu.o generatedatafile.o clean gcc -g main.o liu.o generatedatafile.o -o liu $(LIBS) liu depend 4個小節:main.o liu.o generatedatafile.o clean main.o: main.c gcc -c main.c liu.o: liu.c gcc -c liu.c generatedatafile.o: generatedatafile.c gcc -c generatedatafile.c clean: $(RM) *.o |
$make gcc -c main.c gcc -c liu.c gcc -c generatedatafile.c rm -f *.o gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz gcc: main.o: No such file or directory gcc: liu.o: No such file or directory |
因爲總的執行順序: o depend 小結1, o depend 小結2, o depend 小結3, o depend 小結4(clean), o gcc -g main.o liu.o generatedatafile.o -o liu $(LIBS) 等於是在gcc link前,先把*.o又刪掉了,所以出錯 |
正確的做法 $vi Makefile LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient –lz all: liu clean 設一個總的menu小節 o 第一步進行編譯和鏈接是編譯 o 最後一步才刪除 liu: main.o liu.o generatedatafile.o gcc -g main.o liu.o generatedatafile.o -o liu $(LIBS) main.o: main.c gcc -c main.c liu.o: liu.c gcc -c liu.c generatedatafile.o: generatedatafile.c gcc -c generatedatafile.c clean: $(RM) *.o |
$make gcc -c main.c gcc -c liu.c gcc -c generatedatafile.c gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz rm -f *.o |
makefile的註釋類似shell,在以"#"爲開頭的的文字皆爲註釋
小節(rule)的command裏,就是普通的unix命令,可以是gcc命令,也可以是任何unix command
install: liu chmod 750 liu cp liu /usr/bin liu: liu.o gcc liu.o -o liu |
先執行depend liu小結,生成可執行文件liu 將生成的可執行文件改權限 將生成的可執行文件copy到適當的安裝目錄 |
clean: rm –f *.o 刪除掉中間產生的*.o文件 |
通常在最後鏈接的小節加入刪除語句,刪除掉中間產生的*.o文件
$vi makefile LDFLAGS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz liu: main.o liu.o generatedatafile.o gcc -g main.o liu.o generatedatafile.o -o liu $(LDFLAGS) rm -f *.o |
$make gcc -c main.c gcc -c liu.c gcc -c generatedatafile.c gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz rm -f *.o $ls comm.h generatedatafile.c liu.c makefile testm dataf liu main.c makefile.bak testm.c |
用make的內部宏$(RM)實現刪除
vi Makefile liu: main.o liu.o generatedatafile.o gcc -g main.o liu.o generatedatafile.o -o liu $(LDFLAGS) $(RM) *.o |
$make gcc -c main.c gcc -c liu.c gcc -c generatedatafile.c gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz rm -f *.o |
makefile文件中的宏變量替換、宏變量引用要帶$()
$vi makefile LDFLAGS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz liu: main.o liu.o generatedatafile.o gcc -g main.o liu.o generatedatafile.o -o liu $LDFLAGS $make gcc -c liu.c gcc -g main.o liu.o generatedatafile.o -o liu DFLAGS gcc: DFLAGS: No such file or directory *** Error code 1 |
$vi makefile liu: main.o liu.o generatedatafile.o gcc -g main.o liu.o generatedatafile.o -o liu $(LDFLAGS) $make gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz |
爲什麼make 引用變量要加$( )?
因爲那根本不是變量,而是宏
Makefile中所有文件名都是路徑名,可以帶目錄路徑,如src/main.c
main.o: main.c comm.h
gcc -c main.c $(INC) 源文件在當前目錄下
main.o: src/main.c include/comm.h
gcc -c src/main.c $(INC) 源文件在子目錄下
$@ 和$? 的用法:
target:depend
$@ : $?
liu:
main.o liu.o generatedatafile.o gcc -g $? -o $@ $(LIBS) |
$? 可以代替多個(所有的)depend
$vi Makefile LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz all: liu clean liu: main.o liu.o generatedatafile.o gcc -g $? -o $@ $(LIBS) main.o: main.c gcc -c $? liu.o: liu.c gcc -c liu.c generatedatafile.o: generatedatafile.c gcc -c $? clean: $(RM) *.o |
編譯時,不用帶.h文件
$vi makefile
main.o: main.c comm.h
gcc -c main.c
所謂“編譯帶不帶.h"文件的實質----depend是做什麼用的
depend的含義:如果target檢查發現depend中有任何一個自己新,就重新編譯。
<Target 1>: depend <command 1> <command 2> |
main.o: main.c comm.h gcc -c main.c |
其他如stdio.h之類的標準頭文件,也沒必要出現在depend中
liu.o: liu.c /usr/ /include/mysql/mysql.h gcc -c liu.c |
liu: main.o main.o:main.c |
depend xxx.h文件的缺憾,不能繼續用$?了
main.o: main.c comm.h gcc -c $? |
$make gcc -c src/main.c include/comm.h –Iinclude 顯然$?編譯時把comm.h也編譯進去了 |
正確的做法:直接用文件名,不用$? main.o: src/main.c include/comm.h gcc -c src/main.c $(INC) 只能直接用文件名了,不能用$?了 |
採用結構化編程的make
- 目錄樹
mysqltmp---src---main.c liu.c generatedatafile.c ---include--comm.h ---lib--libcomm.so或libcomm.a |
- 在頂層目錄建立Makefile
vi Makefile LIBS=-L/usr/local/mysql/lib/mysql -L/export/home/macg/mysqltmp/lib -lmysqlclient -lz -lcomm INC=-Iinclude all: liu clean liu: main.o liu.o generatedatafile.o gcc -g $? -o $@ $(LIBS) main.o: src/main.c gcc -c $? $(INC) 自定義頭文件不能重複include 建議在main.c中include(假設有多個文件使用) 或者在使用文件include(假設只有一個文件使用) liu.o: src/liu.c gcc -c $? generatedatafile.o: src/generatedatafile.c gcc -c $? clean: $(RM) *.o |
- make
$make gcc -c src/liu.c gcc -c src/generatedatafile.c gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz rm -f *.o |
[macg@machome]:/export/home/macg/mysqltmp>$ls -F Makefile dataf lib/ src/ liu* include/ [macg@machome]:/export/home/macg/mysqltmp>$ls src generatedatafile.c liu.c main.c [macg@machome]:/export/home/macg/mysqltmp>$ls include comm.h [macg@machome]:/export/home/macg/mysqltmp>$ls lib comm.c comm.o libcomm.so |
轉自:http://blog.sina.com.cn/s/blog_6151984a0100er9a.html