如何編寫Makefile?


//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

 今天老師又講了另一種方法來編寫Makefiel

我們來看下

//文件名為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.c

 

 

重新寫Makefile文件

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 $^

執行情況同上,就不截圖了啊!!!

 重新寫Makefile

EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)
$(CC) -o $@ $^
%.o:%.c
$(CC) -o $@ -c $<
cleal:
rm *.o $(EXEC)

執行情況如下:

重新寫Makefile

 

EXEC=/usr/bin/www  把可執行文件放在

任意一個系統默認的路徑里,就可以只用文件名來執行,而不用像以前那樣輸入./test;

為什么我這兒要將EXEC=/usr/bin/test換為www因為如果不換不能在任意目錄通過文件名來執行,但是可以通過絕對路徑來執行(/usr/bin/test),我估計以前我創建

了test在上述路徑的目錄里,所以可能執行了以前的,沒有執行這次的二進制文件!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM