//swap.c #include<stdio.h> int swap(int *x,int *y) {printf("a=%d b=%d\n",*x,*y); int z; z=*x; *x=*y; *y=z; printf("a=%d b=%d\n",*x,*y); } //max.c int max(int a,int b) { return a>b?a:b; } //test.c int main() { int x=3,y=4; printf("max=%d\n",max(x,y)); swap(&x,&y); }
下來咱們來編寫Makefile文件
vi Makefile //文件名必定要爲Makefile,不能是其餘任何名字,標準爲Makefile,書上寫的是makefile
all:test//all也能夠改成其餘任何名字 max.o:max.c gcc -o max.o -c max.c//最前面是個TAB鍵,固定格式不能修改的!!! swap.o:swap.c gcc -o swap.o -c swap.c test.o:test.c gcc -o test.o -c test.c test:max.o swap.o test.o gcc -o test swap.o max.o test.o
編寫Makefile時,最好用vi編輯器,不可用記事本gedit,不然會出現以下錯誤的!!!!
接着昨天的寫
touch能夠修改文件的時間!能夠看出如今swap.c的時間大於swap.o的時間!
make的原理
1:makefile怎麼知道了哪一個文件被修改了
根據時間判斷哪一個文件被修改了
make如何知道那個.c文件被修改了,而後只從新單獨編譯此文件,其餘沒有修改的文件不會被再次編譯,
若是隻修改了某個.o文件,只作連接,這節省了好多時間的啊!!一句話只要作了修改,最後的的連接是必不可少的!!!
2:makefile文件是如何執行的呢?
exe:test max.o:max.c gcc -o max.o -c max.c swap.o:swap.c gcc -o swap.o -c swap.c test.o:test.c gcc -o test.o -c test.c test:max.o swap.o test.o gcc -o test swap.o max.o test.o [root@linux Makefile_example]#
若是沒有.o文件的話,那麼就所有執行上面的全部操做!
若是已經make後,再次修改某個.o或者.c文件而後用他們的時間進行比較,若是.o文件的時間小於.c文件的時間,說明.c文件被修改過,那麼就執行gcc -o xxx.o -c xxx.c這句
接着執行gcc -o test swap.o max.o test.o這句!
還有一個問題那就是爲神魔要開頭的這一句呢!exe:test
由於如圖:
test至關於main函數max.o swap.o test.o至關於調用函數!函數調用完畢後返回調用函數處,接着調用下一個函數;好像也能夠不用最上面的exe:test,可是要把下面的語句放在最上面才能夠!!!
test:max.o swap.o test.o
gcc -o test swap.o max.o test.o
今天老師又講了另外一種方法來編寫Makefiellinux
咱們來看下編輯器
//文件名爲Makefile函數
EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)//這句兩句必定要放在這兒,不能放在後面那三
$(CC) -o $(EXEC) $(OBJS)
max.o:max.c
$(CC) -o max.o -c max.c
swap.o:swap.c
$(CC) -o swap.o -c swap.c
test.o:test.c
$(CC) -o test.o -c test.cspa
從新寫Makefile文件3d
EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)
$(CC) -o $@ $^
max.o:max.c
$(CC) -o $@ -c $<
swap.o:swap.c
$(CC) -o $@ -c $^
test.o:test.c
$(CC) -o $@ -c $^ code
執行狀況同上,就不截圖了啊!!!blog
從新寫Makefileit
EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)
$(CC) -o $@ $^
%.o:%.c
$(CC) -o $@ -c $<
cleal:
rm *.o $(EXEC)io
執行狀況以下:編譯
從新寫Makefile
EXEC=/usr/bin/www 把可執行文件放在
任意一個系統默認的路徑裏,就能夠只用文件名來執行,而不用像之前那樣輸入./test;
爲何我這兒要將EXEC=/usr/bin/test換爲www由於若是不換不能在任意目錄經過文件名來執行,可是能夠經過絕對路徑來執行(/usr/bin/test),我估計之前我建立
了test在上述路徑的目錄裏,因此可能執行了之前的,沒有執行此次的二進制文件!!!