【转】Windows_makefile_01

【原创】Windows 下的 Makefile 编写(一)Makefile的基本规则 - 看雪安全论坛.html

http://bbs.pediy.com/showthread.php?t=126998

 

Windows 下的 Makefile 编写(一)Makefile的基本规则

作者:cntrump

    Makefile对于很多人来说是陌生的,特别是习惯于使用 IDE 的人来说,似乎没有听说过 Makefile ,因为Makefile 的工作都由IDE代劳了。但是Makefile 的地位是不可忽略的,从VC诞生到现在Nmake这个实用程序就一直伴随着VC编译器一起发行。

    很多大的工程都是基于Makefile编译和维护的,对于开源项目来说,大多数都使用Makefile进行编译,使用IDE来编译大型工程是不可想象的。

    Makefile是什么?它是一个文本文件,里面记录着项目由哪些目标构成,以及各个目标的生成方式等信息,Makefile的核心任务是定义一系列的规则,然后由Nmake来解释执行,任何一个文本编辑器都可以用来编写Makefile。

    先来大概看一下Makefile的基本规则:

代码:
    Target:dependent;command

       Command

       ........
Target 是目标,目标可以是一个文件,也可以是一个标签,如果Target用作标签,则称之为伪目标。Makefile至少要有一个目标。

Dependent是依赖项目,指明目标所依赖的具体项目。依赖项目和目标之间用 : 号分隔。

Command是命令,如果命令和依赖项目在同一行,则需要使用;号与之相隔,各个命令之间使用空格或Tab键分开,如果命令是单独一行,则需要使用Tab缩进。Command命令由Nmake来执行。

    上述内容简单地表明了一个依赖关系,生成Target目标依赖dependent中指定的文件,而生成的规则由Command来定义,Nmake负责执行这些命令。

    默认情况下,Nmake会查找当前目录下任何名称为Makefile的文件(名称不区分大小写,并且没有后缀),如果你的Makefile文件名称是其他的,则需要使用 –f 参数指定。

    以上就是Makefile的核心内容,任何系统的Makefile都是这样执行的。但是要写好一个Makefile,仅仅这些还不够。

    对于一个新知识,我更喜欢从做中学。下面举一个例子来说明上面的规则在实际应用中如何操作:

代码:
    Test.exe:main.obj

       Link.exe main.obj /out:Test.exe

    main.obj:main.cpp

    #仅编译文件

       cl.exe main.cpp 
     在Makefile中注释使用 # 号开头,且仅有这一种注释方式。它的作用和C++ 语法中的 // 注释是一样的。所不同的是 # 号必须放在行首。

上面的Makefile 文件指定了两个目标,分别是Test.exe 和 main.obj,生成Test.exe需要依赖 main.obj文件,而生成 main.obj文件依赖main.cpp。在目标下方指明了生成该目标方法。

    main.cpp 的内容如下:

代码:
#include <stdio.h>

int main()

{

  printf("Hello Makefile!\n");

  return 0;

}
 
     将Makefile和main.cpp放置于同一目录下,在VC的命令提示符窗口中执行 nmake命令,就会自动生成Test.exe和 main.obj两个文件。再运行生成后的Test.exe测试一下:
名称:  image002.jpg 查看次数: 673 文件大小:  3.5 KB

    在Makefile中定义了两个目标,Nmake默认只生成Makefile中的第一个目标,由于main.obj是Test.exe 的依赖项,所以main.obj目标也得以执行。

    是不是每执行一次namke命令就会重新生成一次目标文件呢?答案:不是。每次都重新生成目标显然是一种资源浪费,nmake是根据时间戳来决定是否需要重新生成目标。只有在依赖文件不存在或者依赖文件时间高于目标文件时,nmake才会生成目标。

    前面的例子已经生成了目标文件,如果修改了main.cpp中的代码或者删除了main.obj,都将会重新生成Test.exe。

    一般来说,为了使清理中间文件或重新生成目标更加方便,都会在Makefile中加入一个伪目标来清理生成的中间文件。以删除main.obj为例,Makefile修改如下:

代码:
Test.exe:main.obj

    Link.exe main.obj /out:Test.exe

Main.obj:main.cpp

# 仅编译文件

    cl.exe /c main.cpp

clean:

    @del *.obj

    @echo Project has clean.
 
clean是一个伪目标,只是作为标签使用。clean下的指令是命令行下的删除文件命令和显示一个字符串。在命令前加 @ 符号是为了不显示命令本身。

默认情况下nmake只会生成第一个Test.exe目标,不会执行到clean目标,如果要指定生成目标,需要显式指定目标名称:

代码:
nmake clean
就指定要执行Makefile中的clean伪目标。执行之后会删除生成的main.obj并显示一行文字:

名称:  image004.jpg 查看次数: 673 文件大小:  10.3 KB
还可以指定多个目标,nmake会从左往右依次生成目标。所以如果要在清除中间之后立即生成Test.exe,可以这么做:

    nmake clean Test.exe
名称:  image006.jpg 查看次数: 674 文件大小:  22.0 KB

一般来说,总是把最终生成的目标放在最前,而把清理中间文件的伪目标放到最后。下一回,我会结合实际的例子再介绍Makefile的其他内容。*转载请注明来自看雪论坛@PEdiy.com 
 

 

转载于:https://www.cnblogs.com/DriverSkill/p/6183649.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows系统上安装Makefile需要进行以下步骤: 1. 首先,你需要安装一个GNU工具集,其中包括GNU Make。你可以从MinGW(Minimalist GNU for Windows)或者Cygwin获取这些工具。这两个工具集都提供了GNU工具的Windows版本。 - MinGW:你可以从MinGW的官方网站(https://mingw-w64.org/doku.php)下载安装程序。选择适合你系统的版本,并按照安装向导进行安装。在安装过程中,确保选择了"mingw32-make"作为安装的组件之一。 - Cygwin:你可以从Cygwin的官方网站(https://www.cygwin.com/)下载安装程序。下载并运行安装程序,按照向导进行安装。在选择软件包时,搜索并选择"make"和"gcc-core"等相关软件包进行安装。 2. 安装完成后,打开命令提示符(CMD)或者PowerShell,并输入"make -v"命令来验证Make是否成功安装。如果成功安装,将显示Make的版本信息。 3. 确保你的Makefile文件位于当前工作目录下。在命令提示符或者PowerShell中,使用"cd"命令切换到Makefile所在的目录。 4. 运行Make命令来执行Makefile。在命令提示符或者PowerShell中,输入"make"命令并按下回车键。Make将根据Makefile中的规则和依赖关系来编译和构建项目。 请注意,Makefile是一种用于自动化构建的脚本文件,它使用Make工具来执行一系列命令。在使用Makefile之前,你需要了解Makefile的语法和规则。如果你对Makefile不熟悉,可以参考相关的教程和文档来学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值