一個簡單的makefile文件編寫
阿新 • • 發佈:2017-10-29
href 描述 打開 代碼 targe ++ printf alloc 一個
) (註意前面用tab鍵開頭)
下午閑來無聊,就打開很久沒動過的linux系統想熟悉熟悉在linux上面編譯代碼,結果一個makefile文件搞到晚上才搞定,哈哈!
先把代碼簡單貼上來,就寫了一個冒泡排序:
sort.h:
#ifndef SORT_H #define SORT_H #include<stdio.h> #include<time.h> #include<stdlib.h> #define N 10 #define swap(a,b) {a^=b;b^=a;a^=b;} #define ins(a,b,c) for( a = b ; a < c ; ++a) void bub_sort(); #endif
sort.c:
#include"sort.h" void bub_sort(){ int *in; int i , j; in = malloc(N*sizeof(int)); srand((unsigned)time(NULL)); ins(i,0,N){ in[i] = rand()%100; } ins(i,0,N){ printf("%d%s",in[i],i == N-1 ? "\n" : "->"); } ins(i,0,N-1){ ins(j,i,N){ if(in[i] > in[j]){ swap(in[i] , in[j]); } } } ins(i,0,N){ printf("%d%s" , in[i] , i == N-1 ? "\n" : "->"); } free(in); in = NULL; }
main.c:
#include"sort.h" int main(){ bub_sort(); return 0; }
如果直接編譯的話得用三條指令:
gcc -c sort.c -o sort.o gcc -c main.c -o main.o gcc main.o sort.o -o main
每一次編譯的時候如果都得敲這三行代碼就顯得效率很低了,所以嘗試著寫一個makefile文件;
編寫makefile時有一定的規則:
目標(target) : 需要的條件(dependencies) (註意冒號兩邊有空格)
命令(system command
解釋一下:
1 目標可以是一個或多個,可以是Object File,也可以是執行文件,甚至可以是一個標簽。
2 需要的條件就是生成目標所需要的文件或目標
3 命令就是生成目標所需要執行的腳本
總結一下,就是說一條makefile規則規定了編譯的依賴關系,也就是目標文件依賴於條件,生成規則用命令來描述。在編譯時,如果需要的條件的文件比目標更新的話,就會執行生成命令來更新目標。
makefile:
OBJS = main.o sort.o main: $(OBJS) gcc $(OBJS) -o main //註意:命令前面必須為(tab) main.o: main.c sort.h gcc -c main.c -o main.o sort.o: sort.c sort.h gcc -c sort.c -o sort.o clean: rm -rf *.o main
上面的makefile文件中執行四條指令:
第一:
main: $(OBJS) #main依賴於main.o sort.o
(tab)gcc $(OBJS) -o main #命令行,前面必須為tab,編譯出main可執行文件。-o表示你指定 的目標文件名。
第二:
main.o: main.c sort.h #main.o依賴於main.c sort.h
gcc -c main.c -o main.o 編譯出file1.o文件。-c表示gcc 只把給它的文件編譯成目標文件, 用源碼文件的文件名命名但把其後綴由“.c”變成“.o”。在這句中,可以省略-o file1.o,編譯器默認生成file1.o文件,這就是-c的作用。
第三:
sort.o: sort.c sort.h #與第二類似 gcc -c sort.c -o sort.o
第四:
clean: rm -rf *.o main
當用戶鍵入make clean命令時,會刪除*.o 和helloworld文件。
寫好makefile,在終端裏面直接鍵入make就會執行makefile中的指令了:
m@m-computer:~/c學習/hello$ make gcc main.o sort.o -o main m@m-computer:~/c學習/hello$ ls main main.c main.o makefile sort.c sort.h sort.o m@m-computer:~/c學習/hello$ ./main 84->6->29->53->82->74->42->55->20->56 6->20->29->42->53->55->56->74->82->84
參考:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html
一個簡單的makefile文件編寫