博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Windows_makefile_01
阅读量:6682 次
发布时间:2019-06-25

本文共 2445 字,大约阅读时间需要 8 分钟。

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

 

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 
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.exeMain.obj:main.cpp# 仅编译文件    cl.exe /c main.cppclean:    @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

你可能感兴趣的文章
LVS的三种转发模型及简单调优
查看>>
BeanShell中实现接口
查看>>
BeanShell变量修饰符
查看>>
WireShare:移动办公中管理、阅读、分享文件的好帮手
查看>>
Backup-based duplicate (RAC-RAC)
查看>>
pipework配置docker网桥网络
查看>>
hp-unix下trusted system 与!trusted system的配置
查看>>
【Android游戏开发之二】剖析游戏开发用view还是surfaceView ?!
查看>>
路由器故障之IOS文件丢失
查看>>
二、Hibernate的基本元素
查看>>
DRBD使用gfs2,cman实现双主集群文件存储方案
查看>>
Spring使用内存数据库三
查看>>
openstack 遇到的问题一
查看>>
Network Connect问题
查看>>
perl笔记之排序
查看>>
LAMP自动安装脚本(下)
查看>>
Protocol Block成员变量补充
查看>>
SQL中CONVERT转化函数的用法
查看>>
MySQL Study之--MySQL关闭自动commit(autocommit)
查看>>
RHEL4安装gcc解决无编译环境的苦恼
查看>>