免费注册 查看新帖 |

Chinaunix

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

makefile学习 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-20 19:45 |只看该作者 |倒序浏览

                写MAKEFILE的原因与目的:
Linux环
境下的大型项目开发中,通常把整个系统划分为若干模块,每个模块完成某一相对独立的功能,各个模块相互作用以构成一个完整的系统。对于这样的一个软件系
统,是不可能只使用一条或几条gcc命令就可以编译声称可执行程序的。而且模块通常要经历几次修改,每次模块修改后如果都由人工来输入命令以完成编译,这
样既效率地下又容易出错。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
[color="#f000f0"]Makefile的组成:(两部分:依赖关系和规则)
依赖关系由一个目标和一组该目标所依赖的源文件组成。这里所说的目标就是将要创建或更新的文件,最常见的是可执行文件。
规则用来说明怎样使用所依赖得文件来
建立目标文件。当make命令运行时,会读取makefile来确定要建立的目标文件或其他文件,然后对源文件的日期和时间进行比较,从而决定使用那些规
则来创建目标文件。
默认时,make程序只更新makefile中的第一个目标,如果希望更新多个目标文件的话,可以使用一个特殊的目标all,假如我们想在一个makefile中更新main和hello这两个程序文件的话,可以加入下列语句达到这个目的:all: main hello
需要注意的是,如果相关行写成一行,“命令”之前用分号“;”隔开,如果分成多行书写的话,后续的行务必以tab字符为先导。此外,如果在makefile文件中的行尾加上空格键的话,也会导致make命令运行失败。所以,大家一定要小心了,免得耽误许多时间。
我们来看一个比较简单的makefile如何写?看下面这个例子,看看makefile 如何演化出来的:
http://linux.chinaunix.net/doc/program/2005-01-18/805.shtml
Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

  • 显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
  • 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
  • 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。

  • 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指
    定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
  • 注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“\#”。Make的宏分为两类,一类是用户自己定义的宏,一类是系统内部定义的宏。用户定义的宏必须在makefile或命令行中明确定义,系统定义的宏不由用户定义。
    all: main
    # 使用的编译器
    CC = gcc
    #包含文件所在目录
    INCLUDE = .
    # 在开发过程中使用的选项
    CFLAGS = -g -Wall –ansi
    # 在发行时使用的选项
    # CFLAGS = -O -Wall –ansi
    main: main.o f1.o f2.o
    $(CC) -o main main.o f1.o f2.o
    main.o: main.c def1.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
    f1.o: f1.c def1.h def2.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c f1.c
    f2.o: f2.c def2.h def3.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c f2.c
    $? :比目标的修改时间更晚的那些依赖模块表。
    $@ :当前目标的全路径名。可用于用户定义的目标名的相关行中。
    $< :比给定的目标文件时间标记更新的依赖文件名。
    $* :去掉后缀的当前目标名。例如,若当前目标是pro.o,则$*表示pro。
                   
                   
                   
                   
                   

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

    本版积分规则 发表回复

      

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

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP