初识makefile

Posted christ0127

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识makefile相关的知识,希望对你有一定的参考价值。

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一下,清除临时文件。

 

以上是关于初识makefile的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

makefile(01)_初识

初识 makefile 的结构

Linux----编译器+gdb+初识make/Makefile+git

Linux0.11之初识Makefile/build.c