christ0127

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Makefile的规则

  目标 : 需要的条件 (注意冒号两边有空格)

    命令  (注意前面用tab键开头)

  解释一下:

  1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。

  2 需要的条件就是生成目标所需要的文件或目标

  3 命令就是生成目标所需要执行的脚本

  总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。

 

下面举个简单的例子说明。如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。

edit : main.o kbd.o command.o display.o /
           insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o /
                       insert.o search.o files.o utils.o

main.o : main.c defs.h
            cc -c main.c
kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
command.o : command.c defs.h command.h
            cc -c command.c
display.o : display.c defs.h buffer.h
            cc -c display.c
insert.o : insert.c defs.h buffer.h
            cc -c insert.c
search.o : search.c defs.h buffer.h
            cc -c search.c
files.o : files.c defs.h buffer.h command.h
            cc -c files.c
utils.o : utils.c defs.h
            cc -c utils.c
clean :
            rm edit main.o kbd.o command.o display.o /
               insert.o search.o files.o utils.o

以上内容摘自如何编写makefile

 

下面来说说自己的总结:

  我写了三个文件:hello.c test.c test.h。内容如下:

hello.c:

#include <stdio.h>
#include "test.h"

void main(void)
{
    char s[] = "Bye~";
    printf("Hello World!\n");
    test(s);       
}

test.h:

#ifndef __TEST_H_
#define __TEST_H_

#include <stdio.h>

int test(char *s);

#endif

test.c:

#include "test.h"

int test(char *s)
{
    printf("%s...\n",s);
    return 1;
}

makefile如下:

main : hello.o test.o
    gcc -o main1 hello.o test.o
hello.o : hello.c
    gcc -c hello.c
test.o : test.c test.h
    gcc -c test.c
clean : 
    rm hello.o test.o

其中,第一行的main只是一个标签,怎样写都可以。第二行的main1才是最终生成的目标文件,并且目标和依赖的位置可以互换,比如:

gcc hello.o test.o -o main1

如果工程中包含头文件,只需要在第一行的依赖中写出来,第二行不用写:
test.o : test.c test.h
    gcc -c test.c

make完了之后再make clean一下,清除临时文件。

 

posted on 2016-10-26 11:07  christ0127  阅读(206)  评论(0编辑  收藏  举报