免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 805 | 回复: 0
打印 上一主题 下一主题

Gcc的Makefile简单使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-06 16:05 |只看该作者 |倒序浏览

Makefile文件的简单使用

下面针对只有几个文件的程序来简单试验一下Makefile
在这里要准备四个文件

/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
#include
#include

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

/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
#include
#include

/* mytool2.c*/
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}

/*main.c*/
#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}

上面的程序我们可以这样编译:
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o

这样也可以产生main程序,而且也不时很麻烦.但如果要编译的文件很多的话,这种方法就不太适宜了。为此有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 是如何编写的:

在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
[email=有三个非常有用的变量.分别是$@,$%5e,$%3c]有三个非常有用的变量。分别是$@,$^,$[/email]
代表的意义分别是:
$@  --  目标文件,
$^   --  所有的依赖文件,
$第一个依赖文件.
如果我们使用上面三个变量,那么我们可以简化我们的Makefile 文件为:
1
#这是简化后的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 $
clean :
         -rm main main.o mytool1.o mytool2.o

2
# 或者使用变量如下:
#/*Makefile*/
objects=main.o mytool1.o mytool2.o
main:$(objects)
         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 $
clean :
         -rm main $(objects)
经过简化后我们的Makefile 是简单了一点,不过还可以再简单一点.这里我们学习
一个Makefile 的缺省规则
..c.o:
gcc -c $

这个规则表示所有的 .o 文件都是依赖与相应的.c 文件的.例如mytool1.o 依赖于mytool1.c
这样Makefile 还可以变为:
#  这是再一次简化后的Makefile
objects=main.o mytool1.o mytool2.o      
main:$(objects)
         gcc -o $@ $^
..c.o:
         gcc -c $
clean :
         -rm main $(objects)

好了,我们的Makefile也差不多了,如果想知道更多的关于Makefile 规则可以查看相应的文档。
我这有一个很好的Make中文手册,想要的可以email我
vxpice@163.com


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/65503/showart_518908.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP