Makefile的编写

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

Makefile 的编写

假设我们有这样一个程序由五个文件组成,源代码如下:

/* main.c */

#include "mytool1.h"

#include "mytool2.h"

int main(int argc,char **argv)

{

mytool1_print("hello mytool1!");

mytool2_print("hello mytool2!");

return 0;

}

 

/* mytool1.h */

#ifndef _MYTOOL_1_H

#define _MYTOOL_1_H

void mytool1_print(char *print_str);

#endif

 

/* mytool1.c */

#include "mytool1.h"

#include <stdio.h>

void mytool1_print(char *print_str)

{

printf("This is mytool1 print %s\n",print_str);

return 0;

}

 

/* mytool2.h */

#ifndef _MYTOOL_2_H

#define _MYTOOL_2_H

void mytool2_print(char *print_str);

#endif

 

/* mytool2.c */

#include "mytool2.h"

#include <stdio.h>

void mytool2_print(char *print_str)

{

printf("This is mytool2 print %s\n",print_str);

return 0;

}

 

当然由于这个程序是很短的, 我们可以这样来编译

gcc -c main.c

gcc -c mytool1.c

gcc -c mytool2.c

gcc -o main main.o mytool1.o mytool2.o

 

当然,我们也可以写一个shell 脚本,不过聪明的程序员开发了一个很好的工具来做这件事情,那就是make ,首先编写一个很重要的文件Makefile 文件,对于上面的那个程序来说, 可能的一个 Makefile 的文件是:

# 这是上面那个程序的 Makefile 文件

main:main.o mytool1.o mytool2.o

gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c main.c

mytool1.o:mytool1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c

 

 

 

有了这个 Makefile 文件, 不论我们什么时候修改了源程序当中的文件, 我们只要执行

make 命令, 我们的编译器都只会去编译和我们修改的文件有关的文件, 其它的文件她连理

都不想去理的。

下面我们学习 Makefile 是如何编写的.

Makefile 中由# 开始的行都是注释行。Makefile 中最重要的是描述文件的依赖关系

的说明。一般的格式是:

 

target: components

TAB rule

 

第一行表示的是依赖关系。第二行是规则.

比如说我们上面的那个 Makefile 文件的第二行

main:main.o mytool1.o mytool2.o

表 示 我 们 的 目 标 (target)main 的 依 赖 对 象 (components) main.o mytool1.o

mytool2.o 当依赖的对象在目标修改后修改的话, 就要去执行规则一行所指定的命令, 就象 我们的上面那个 Makefile 第三行所说的一样要执行

gcc -o main main.o mytool1.o mytool2.o

注意规则一行中的 TAB 表示那里是一个 TAB

Makefile 有三个非常有用的变量, 分别是$@$^$< 。代表的意义分别是:

$@-- 目标文件 ,

$^-- 所有的依赖文件 ,

$<-- 第一个依赖文件。

如果我们使用上面三个变量, 那么我们可以简化我们的 Makefile 文件为:

# 这是简化后的 Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h

gcc -c $<

mytool1.o:mytool1.c mytool1.h

gcc -c $<

mytool2.o:mytool2.c mytool2.h

gcc -c $<

 

经过简化后我们的 Makefile 是简单了一点, 不过人们有时候还想简单一点。这里我们

学习一个 Makefile 的缺省规则

..c.o:

gcc -c $<

这个规则表示所有的 .o 文件都是依赖与相应的 .c 文件的 。例如 mytool.o 依赖于

mytool.c, 这样 Makefile 还可以变为:

# 这是再一次简化后的 Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

..c.o:

gcc -c $<

 

好了, 我们的 Makefile 也差不多了。如果想知道更多的关于 Makefile 规则可以查看

相应的文档.

你可能感兴趣的:(C++,c,C#,脚本,gcc)