VS中的c++的makefile nmake
2016-12-18 20:33
239 查看
VS中的c++的makefile nmake简介大家已经习惯于微软提供的功能强大的IDE,已经很少考虑手动编连项目了,所谓技多不压身,有空的时候还是随我一块了解一下命令行编译。C/C++/VC++程序员或有Unix/Linux编程经验应该很熟悉,以前我曾写过一篇文章描述用csc/vbc来进行命令行编译,今天再介绍一下MS提供的更加快捷有效的编译工具NMake。 MSDN的描述: Microsoft 程序维护实用工具 (NMAKE.EXE) 是一个 32 位,基于说明文件中包含的命令生成项目的工具。 NMake具有丰富的选项,可以完成复杂编译操作。它可以辨别源代码的改动,并选择性的编译,为你节省大量不必要的编译时间。 使用NMAKE语法:NMAKE [options] [macros] [targets] [@commandfile]说明:其中,options是NMAKE的选项,macros是在命令行中的宏定义,targets是NMAKE的目标文件列表,commandfile是包含命令行输入的文本文件(或响应文件)。 NMAKE 使用指定 /F 选项的Makefile(生成文件,通常名字是makefile);如果未指定 /F 选项,则使用当前目录下的Makefile。如果未指定Makefile,则 NMAKE 使用推理规则生成命令行 targets。 NMake本身很简单,与NMAKE配合的是Makefile。Makefile的语法比较复杂,通常需要开发者自己手动编写Makefile,下一节我们详细讲解Makefile。 上面的options和macros做了MSDN的链接,内容较多,请自己查询相关页,可以从这里进入NMake的MSDN帮助页面,在线帮助点这里。 编写MAKEFILE注:本节内容来自MSDN,熟悉此节的朋友可以直接跳过Makefile的组成部分包括:成文件包含: 描述块 (description block) 命令 宏 推理规则 (inference rules) 点指令 预处理指令 a.描述块 描述块是后面可跟有命令块的依赖项行: targets... : dependents... commands... 依赖项行指定一或多个目标以及零或多个依赖项。目标必须位于行首。用冒号 (:) 将目标和依赖项分开;允许使用空格或制表符。若要拆分行,请在目标或依赖项后面使用反斜杠 (\ )。如果目标不存在、目标的时间戳比依赖项早或者目标是伪目标,则 NMAKE 执行命令。如果某依赖项是其他地方的目标,并且不存在或对于自己的依赖项已过期,则 NMAKE 在更新当前依赖项之前更新该依赖项。 b.命令 如果依赖项已过期,则描述块或推理规则指定要运行的命令块。NMAKE 在运行命令之前显示每个命令,除非使用了 /S 选项、.SILENT、!CMDSWITCHES 或 @。如果描述块后面没有紧跟命令块,NMAKE 将查找匹配的推理规则。 命令块包含一个或多个命令,每个命令位于各自的命令行上。在依赖项(或规则)和命令块之间不能出现空行。但是可以出现只包含空格或制表符的行;该行被解释为空命令,并且不出现错误。命令行之间允许有空行。 命令行以一个或多个空格或制表符开始。后面紧跟着换行符的反斜杠 ( \ ) 在命令中被解释为空格;在行尾使用反斜杠继续下一行命令。如果反斜杠后紧跟有其他任何字符(包括空格或制表符),则 NMAKE 按原义解释反斜杠。 无论后面是否紧跟有命令块,前面带分号 (;) 的命令可以出现在依赖项行上或推理规则中:project.obj : project.c project.h ; cl /c project.c
.SUFFIXES : 若要将其他后缀添加到列表的末尾,请指定 .SUFFIXES : suffixlist 其中 suffixlist 是附加后缀的列表,由一或多个空格或制表符分隔。若要查看 .SUFFIXES 的当前设置,请运行选项为 /P 的 NMAKE。 f.预处理指令 可以通过使用预处理指令和表达式控制 NMAKE 会话。预处理指令可以放置在生成文件或 Tools.ini 文件中。使用指令可以有条件地处理生成文件,显示错误信息,包括其他生成文件,取消定义宏以及打开或关闭某些选项。 Makefile示例看了一堆理论,很累了吧?下面看一段简单的MakeFile
示例2 下面演示一下多个项目时的编译,每个单独的项目创建单独的makefile,解决方案下放一个总的makefile
小节本文简单介绍了NMAKE的用法,并对Makefile的语法做了介绍。篇幅所限,既不能面面俱到,又不能深入剖析,只希望能够让更多人了解此工具。笔者也是刚刚接触,经验不多,还请各位网友多多拍砖!附表(makefile中常用的几个符号)
|
VS构建工具介绍
我们都知道C/C++源代码要生成可执行的.exe程序,需要经过编译、链接的过程。你在VS工具中只需要选择菜单Build或按一下F5可以编译、链接、运行了,其实IDE帮我隐藏了好多的具体细节。我先假设VS2013安装在以下目录中:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin //这是2013的目录
打开安装目录下的可以看到一系列的可执行程序.exe和批处理文件,这些就是VS2010构建、编译、链接时要用到的工具。看一下几个主要的工具:
cl.exe:编译程序
link.exe:链接程序
lib.exe:加载lib库的程序
nmake.exe:用makefile进行构建、编译的工具
命令行编译程序
要在命令行(而不是VS)中编译程序,先要配制环境变量。网上有些教程说执行VSDIR\VC\bin\vcvars32.bat的批处理就可以了,但我执行这个批处理时会报错:Setting environment for using Microsoft Visual Studio 2010 x86 tools.
这又是另外一个问题,我就不管了,直接手动配制环境变量把:
右键我的计算机->属性->高级系统设置->高级->环境变量,配制的环境变量(建议配制在用户的环境变量中)的值如下:
VS2010_DIR:
C:\Program Files (x86)\Microsoft Visual Studio 10.0
WIN_SDK:
C:\Program Files (x86)\Microsoft SDKs
path:
C:\Users\Administrator.dnx\bin;%VS2010_DIR%\VC\bin;%VS2010_DIR%\Common7\IDE
include:
%VS2010_DIR%\VC\include;%WIN_SDK%Windows\v7.0A\Include;
lib:
%VS2010_DIR%\VC\lib;%WIN_SDK%\Windows\v7.0A\Lib;
测试
D:\CppWorkspace\CommandTest\HelloWorld.cpp:#include <iostream> #include <stdio.h> int main() { std::cout << "This is a native C++ program." << std::endl; printf("printf: Hello World"); return 0; }1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
编译结果:
命令行中编译C/C++程序
HelloWorld.obj就是编译出的二进制文件,HelloWorld.exe就是链接成的可执行文件。
说明
在以上的编译过程中我们只用了cl的编译命令就帮我们最终的可执行文件HelloWorld.exe,这是因为cl.exe程序在编译时自己会去调用link.exe、lib.exe等程序。可通过”cl -help “查看常用的编译选项
选项 | 作用 |
---|---|
/O1 | 创建小代码 |
/O2 | 创建快速代码 |
/Oa | 假设没有别名 |
/Ob | 控制内联展开 |
/Od | 禁用优化 |
/Og | 使用全局优化 |
/Oi | 生成内部函数 |
[plain] view
plain copy
mkdir HelloWorld
cd HelloWorld
用Emacs创建man.cpp文件。
[cpp] view
plain copy
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
再创建一个makefile文件。
[plain] view
plain copy
foo: main.cpp
cl main.cpp
这个makefile文件只包含了一个描述块(Description Block)
语法则是常见的makefile规则:
[plain] view
plain copy
targets... : dependents...
commands...
现在启动windows command窗口,最普通的那种。
然后运行设置环境变量的批处理文件,来自于普通Windows控制台窗口运行nmake编译VC
[cpp] view
plain copy
C:\study\nmake>vc_env.bat x86
Setting environment for using Microsoft Visual Studio 2012 x86 tools.
C:\study\nmake>where nmake
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\nmake.exe
C:\study\nmake>where cl.exe
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cl.exe
C:\study\nmake>where link.exe
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\link.exe
然后进入HelloWorld目录,运行nmake 命令:
[plain] view
plain copy
C:\study\nmake\HelloWorld>nmake
Microsoft (R) Program Maintenance Utility Version 11.00.60610.1
Copyright (C) Microsoft Corporation. All rights reserved.
cl main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.60610.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
main.cpp
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale(336) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
Microsoft (R) Incremental Linker Version 11.00.60610.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
main.obj
有一个警告,以后解决,不过已经看到cl命令了,cl main.cpp,并且最后生成了main.exe和main.obj文件。
现在运行main.exe程序,得到结果:
[cpp] view
plain copy
C:\study\nmake\HelloWorld>main.exe
Hello, world!
VC编译包含两步骤,cl生成obj文件, link将obj文件连接成binary。这里由于没有使用/c参数,所以自动完成了link操作。
转载: http://truly.cnblogs.com/archive/2005/08/13/213810.html#_asug_description_blocks
http://blog.csdn.net/luoweifu/article/details/49847749
http://www.lellansin.com/%E5%BE%AE%E8%BD%AF-cl-exe-%E7%BC%96%E8%AF%91%E5%99%A8.html
相关文章推荐
- VS.net下编写makefile文件--NMAKE用法
- Windows下使用nmake编译C/C++的makefile
- windows环境中使用VC的nmake和makefile编译c++程序
- 在Linux中使用VS Code编译调试C++项目(gcc/g++、Makefile入门、vs code)
- [转]用makefile脚本方式调用vs 2010 的nmake来编译工程的实例
- Windows下使用nmake编译C/C++的makefile
- 用makefile脚本方式调用vs 2010 的nmake来编译工程的实例
- Windows下使用nmake编译C/C++的makefile
- 开发工具大比拼之Visual C++ VS Delphi
- C++VS C#
- 开发工具大比拼之Visual C++ VS Delphi(摘自delphi园地)
- C/C++ 通用 Makefile
- C++基本功和 Design Pattern系列 Inheritance VS Delegation
- 继续C++:gcc编译、连接和makefile的使用
- 开发工具大比拚之Visual C++ vs. Delphi(三)
- C# VS C++
- 开发工具大比拚之Visual C++ vs. Delphi(一)
- 开发工具大比拚之Visual C++ vs. Delphi(二)
- Java vs C++ "Shootout" Revisited
- c++头文件,cpp文件,makefile,unit test自动生成器