下午閑來無聊,就打開很久沒動過的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) (注意前面用tab鍵開頭)
解釋一下:
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
