1. 程式人生 > >一個簡單的makefile文件編寫

一個簡單的makefile文件編寫

href 描述 打開 代碼 targe ++ printf alloc 一個

下午閑來無聊,就打開很久沒動過的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

一個簡單的makefile文件編寫