• 一个简单的makefile文件编写


    下午闲来无聊,就打开很久没动过的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 ? "
    " : "->");
    	}
    
    	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 ? "
    " : "->");
    	}
    	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

  • 相关阅读:
    【题解】[Codeforces 1221D] Make The Fence Great Again【DP】
    PAM / 回文自动机(回文树)略解
    【AGC048F】【2020六校联考WC #9】序列【构造】【DP】
    json解析:[2]fastjson 使用
    JAVA获取时间戳,哪个更快
    Android拍照、录像、录音代码范例
    取消GridView/ListView item被点击时的效果
    Android中使用speex将PCM录音格式转Wav格式
    【Android】【录音】Android录音--AudioRecord、MediaRecorder
    Android软键盘遮挡的四种解决方案
  • 原文地址:https://www.cnblogs.com/jhmu0613/p/7750798.html
Copyright © 2020-2023  润新知