查看: 366|回复: 2

Makefile的概念和编写简单入门

 关闭 [复制链接]

签到天数: 2119 天

连续签到: 7 天

[LV.Master]至尊海神IIIIII

发表于 2009-5-23 13:02 | 显示全部楼层 |阅读模式
Makefile的概念和编写简单入门
1.Makefile的作用:帮助编译多文件。
2.编写规则:

我们以下述源文件作为例子。
#include\"mytool1.h\"
#include\"mytool2.h\"
int main(int argc,char **argv)
{
mytool1_print(\"hello\");
mytool2_print(\"hello\");
}
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif

#include\"mytool1.h\"
void mytool1_print(char *print_str)
{
printf(\"This is mytool1 print %s\",print_str);
}

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif

#include\"mytool2.h\"
void mytool2_print(char *print_str)
{
printf(\"This is mytool2 print %s\",print_str);
}
针对以上代码写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 中最重要的是描述文件的依赖关系的说明.一般的格式是:
target: components
TAB rule
第一行表示的是依赖关系.第二行是规则. TAB 表示那里是一个TAB 键
main:main.o mytool1.o
mytool2.o
表示我们的目标(target)main 的依赖对象(components)是 main.o mytool1.o mytool2.o
实际上是一种庖丁解牛的策略,建议在纸上画好关系依赖图。
main
---main.o--(main.c,mytool1.h,mytool2.h)

|
mytool2.o--(mytool2.c,mytool2.h)

|

mytool1.o--(mytool1.c,mytool1.h)

3.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
main:main.o mytool1.o
mytool2.o
gcc -o $@ $^
..c.o:
gcc -c
$<

其中
..c.o:
gcc -c
$<表示所有的
.o 文件都是依赖与相应的.c 文件的.例如 mytool.o 依赖于
mytool.c
PCOS系统下载站:http://zhuangji.wang

签到天数: 2119 天

连续签到: 7 天

[LV.Master]至尊海神IIIIII

 楼主| 发表于 2009-5-23 13:02 | 显示全部楼层

Makefile的概念和编写简单入门

Makefile的概念和编写简单入门
1.Makefile的作用:帮助编译多文件。
2.编写规则:

我们以下述源文件作为例子。
#include\"mytool1.h\"
#include\"mytool2.h\"
int main(int argc,char **argv)
{
mytool1_print(\"hello\");
mytool2_print(\"hello\");
}
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif

#include\"mytool1.h\"
void mytool1_print(char *print_str)
{
printf(\"This is mytool1 print %s\",print_str);
}

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif

#include\"mytool2.h\"
void mytool2_print(char *print_str)
{
printf(\"This is mytool2 print %s\",print_str);
}
针对以上代码写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 中最重要的是描述文件的依赖关系的说明.一般的格式是:
target: components
TAB rule
第一行表示的是依赖关系.第二行是规则. TAB 表示那里是一个TAB 键
main:main.o mytool1.o
mytool2.o
表示我们的目标(target)main 的依赖对象(components)是 main.o mytool1.o mytool2.o
实际上是一种庖丁解牛的策略,建议在纸上画好关系依赖图。
main
---main.o--(main.c,mytool1.h,mytool2.h)

|
mytool2.o--(mytool2.c,mytool2.h)

|

mytool1.o--(mytool1.c,mytool1.h)

3.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
main:main.o mytool1.o
mytool2.o
gcc -o $@ $^
..c.o:
gcc -c
$<

其中
..c.o:
gcc -c
$<表示所有的
.o 文件都是依赖与相应的.c 文件的.例如 mytool.o 依赖于
mytool.c
PCOS系统下载站:http://zhuangji.wang
回复 支持 反对

使用道具 举报

签到天数: 2119 天

连续签到: 7 天

[LV.Master]至尊海神IIIIII

 楼主| 发表于 2009-5-23 13:02 | 显示全部楼层

Makefile的概念和编写简单入门

Makefile的概念和编写简单入门
1.Makefile的作用:帮助编译多文件。
2.编写规则:

我们以下述源文件作为例子。
#include\"mytool1.h\"
#include\"mytool2.h\"
int main(int argc,char **argv)
{
mytool1_print(\"hello\");
mytool2_print(\"hello\");
}
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif

#include\"mytool1.h\"
void mytool1_print(char *print_str)
{
printf(\"This is mytool1 print %s\",print_str);
}

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif

#include\"mytool2.h\"
void mytool2_print(char *print_str)
{
printf(\"This is mytool2 print %s\",print_str);
}
针对以上代码写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 中最重要的是描述文件的依赖关系的说明.一般的格式是:
target: components
TAB rule
第一行表示的是依赖关系.第二行是规则. TAB 表示那里是一个TAB 键
main:main.o mytool1.o
mytool2.o
表示我们的目标(target)main 的依赖对象(components)是 main.o mytool1.o mytool2.o
实际上是一种庖丁解牛的策略,建议在纸上画好关系依赖图。
main
---main.o--(main.c,mytool1.h,mytool2.h)

|
mytool2.o--(mytool2.c,mytool2.h)

|

mytool1.o--(mytool1.c,mytool1.h)

3.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
main:main.o mytool1.o
mytool2.o
gcc -o $@ $^
..c.o:
gcc -c
$<

其中
..c.o:
gcc -c
$<表示所有的
.o 文件都是依赖与相应的.c 文件的.例如 mytool.o 依赖于
mytool.c
PCOS系统下载站:http://zhuangji.wang
回复 支持 反对

使用道具 举报

本版积分规则