zoukankan      html  css  js  c++  java
  • 如何编写Makefile?

    //swap.c
    #include<stdio.h>
    int swap(int *x,int *y)
    {printf("a=%d b=%d
    ",*x,*y);
     int z;
     z=*x;
     *x=*y;
     *y=z;
     printf("a=%d b=%d
    ",*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
    ",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在上述路径的目录里,所以可能执行了以前的,没有执行这次的二进制文件!!!

  • 相关阅读:
    著名的二分查找的BUG
    C/C++ static用法
    浅谈C++虚函数
    git备忘(长久更新)
    【经典问题】最大子串和
    水波纹效果
    博客迁址 xpeng.scorpionstudio.com
    终于,我们的新产品Fotor Slideshow Maker上线了!!
    分享一款浏览器扩展--美图搜索-图片搜索工具
    分享网页微信防撤回插件
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4388208.html
Copyright © 2011-2022 走看看