Linux makefile讲解

 

  博客不会讲解的太细致深入,推荐先看视频再看博客

  视频链接,推荐去B站观看,B站比较清晰...

  土豆网:http://www.tudou.com/programs/view/19VZ0f3b_I0

  B站:  http://www.bilibili.com/video/av9655080/

 

  在linux中编译.c文件的时候,可以用gcc命令,当然了,如果是100个.c文件你怎么办?这个时候你最好创建一套规则来使用,这时我们就用到了makefile,一切东西的发明创造都是为了方便。

 

  现在我有一个.c文件叫test.c,内容如下:

#include <stdio.h>
void main()
{
    printf("hello wold! \n");          
}

  然后嘞,我用makefile来搞定它!(注意这是在同一个目录下的哦)

test:test.o                              //目标:依赖关系
    gcc test.o -o test                   //注意!这里的是tab键,不是空格,不打tab键会出错的
test.o:test.c
    gcc -c test.c -o test.o        
clean:
    rm *.o test
    

  这就是一个最简单的makefile啦,执行的时候只需要make一下就ok了 (如果你看不懂就去看我的视频,我会讲解为什么要这么写)

 

  看过上面的例子之后可能有人会说makefile的优越性在哪?别急,下面我们来6个.c文件,分别是 m.c m.h visit.c play.c listen.c watch.c study.c

  m.c

#include <stdio.h>
void main()
{
    int i;
    printf("please input the value of i from 1 to 5 :\n");
    scanf("%d",&i);
    if(i==1)
      visit();
    else if(i==2)
      study();
    else if(i==3)
      play();
    else if(i==4)
      watch();
    else if(i==5)
      listen();
    else
      printf("nothing to do \n");
    printf("This is a woderful day\n");      
            
}

  study.c

#include <stdio.h>
void main()
{
    void study()
    {  
        printf("study embedded system today \n"); 
    }      
}

  listen.c

#include <stdio.h>
void main()
{
    void listen()
    {  
        printf("listen english today \n"); 
    }      
}

  play.c

#include <stdio.h>
void main()
{
    void study()
    {  
        printf("play football today \n"); 
    }      
}

  visit.c

#include <stdio.h>
void main()
{
    void study()
    {  
        printf("visit friend today \n"); 
    }      
}

  watch.c

#include <stdio.h>
void main()
{
    void watch()
    {  
        printf("watch TV today \n"); 
    }      
}

  我是不是写了一个m.h文件?这个叫头文件,也叫引用文件,因为m.c里面用了visit(),play()...方法,所以我们也来写一下m.h

void visit();
void listen();
void watch();
void study();
void play();

  这里列举了6个.c文件和一个.h文件,现在我们来写makefile

CC=gcc
TARGET=ALL
OBJECTS=m.o visit.o listen.o watch.o study.o play.o
$(TARGET):$(OBJECTS) 
    $(CC) $(OBJECTS) -o m
m.o:m.c m.h                                      //这里m.o和m.h一起
    $(CC) -c m.c -o m.o
visit.o:visit.c
    $(CC) -c visit.c -o visit.o
listen.o:listen.c
    $(CC) -c listen.c -o listen.o
watch.o:watch.c
    $(CC) -c watch.c -o watch.o
study.o:study.c
    $(CC) -c study.c -o study.o
play.o:play.c
    $(CC) -c play.c -o play.o
clean:
    rm *.o m

  这个应该很好懂的,最后嘞,我介绍一下怎么使用变量来简化操作

CC=gcc
TARGET=ALL
OBJECTS=m.o visit.o listen.o watch.o study.o play.o
$(TARGET):$(OBJECTS) 
    $(CC) $(OBJECTS) -o m
m.o:m.c m.h                                     
    $(CC) -c m.c -o m.o
*.o:*.c                                          // *可以代替目标名称,因为依赖和目标名一样,所以都可以用*来代替
    $(CC) -c $< -o $@                             // $<的意思是依赖,$@的意思是目标
clean:
    rm *.o

 

  

  makefile呢分为在同一个文件下面和不同一个文件下面,我只讲了在同一个文件下面,那个大家自己去查也很简单,就酱~

 

posted @ 2017-04-06 16:40  蜀云泉  阅读(778)  评论(1编辑  收藏  举报