有些时候使用命令行而不是IDE去编译源代码会比较方便。
而在命令行下使用msvc的编译器——cl, 需要为其配置环境。
一、 环境变量测试
测试cl的环境是否配置妥当, 可以执行如下测试:
win键+R 启动运行 -> 输入cmd(winnt系列)或者command(win95系列) -> 回车, 打开命令行窗口。
键入"cl"并回车, 如果有类似如下的输出 :
--------------------------------------------------------------------------------
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
--------------------------------------------------------------------------------
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
--------------------------------------------------------------------------------
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.30729.01 版
版权所有(C) Microsoft Corporation。保留所有权利。
用法: cl [ 选项... ] 文件名... [ /link 链接选项... ]
--------------------------------------------------------------------------------
一般来说, 就可以在命令行下使用cl了。
cl文件版本与VS版本、VC产品版本、_MSC_VER宏的对应关系如下表:
VS版本 |
VC产品版本号 |
cl文件版本号 |
_MSC_VER宏的值 |
98 |
6.x |
12.x |
1200 |
2005 |
8.x |
14.x |
1400 |
2008 |
9.x |
15.x |
1500 |
二、 测试失败
如果出现:
1. “cl不是内部或外部命令,也不是可运行的程序或批处理文件。”
说明cl不在Path环境变量中。
2. 找不到xxx.dll。
cl在Path环境变量中, Path中缺少必要的dll的路径。
3. 上述测试通过, 但是在编译时出现找不到头文件或者库。
说明Path环境变量中有cl和必要dll的路径, 但是仍缺少其他一些环境变量。
这些情况, 都需要进一步配置环境变量。
三、 配置环境变量
三.1 、让安装包帮助注册环境变量
VC6在安装的时候,会弹出一个对话框,让你选择是否注册VC6的环境变量。如下:
For your convenince, the environment variables required to run build tools from a command prompt are saved in the VCVARS32.BAT in your BIN directory
(复选框) Register Environment Variables
Turn on this option to register environment variables for running Visual C++ tools from the command line.
默认复选框是没有选中的。
如果选中, 安装完毕后就会添加必要的环境变量。
所以, 一个办法是重新安装VC6(反正很小,相对于VC8、9安装十分快速)。
三.2 、 手工添加环境变量
以VC6举例,我们可以在 :“我的电脑” -> “属性” -> “高级” -> “环境变量”中添加如下变量:
%Path%=" prefix\Microsoft Visual Studio\VC98\Bin";%Path%
cl.exe所在路径。
%include%=" prefix \Microsoft Visual Studio\VC98\Include";%include%
%lib%=" prefix\Microsoft Visual Studio\VC98\Lib";%lib%
C/C++以及Platform SDK
%include%=" prefix\Microsoft Visual Studio\VC98\MFC\Include";%include%
%lib%=" prefix\Microsoft Visual Studio\VC98\MFC\Lib";%include%
MFC
%include%=" prefix\Microsoft Visual Studio\VC98\ATL\Include";%include%
ATL
(其中的 prefix是安装目录的前缀)之后就可以在命令行中使用cl了。
同时, VC6、8、9都提供了一个批处理 vcvars32.bat 。
我们可以查看相应的vcvars32.bat最终做了什么工作,而手工加入需要的变量。
下内容摘自我机器上的v svars32.bat(VC8、9的vcvars32.bat最终调用它们):
@set PATH=D:\Program Files\Microsoft Visual Studio 8\Common7\IDE;D:\Program Files\Microsoft Visual Studio 8\VC\BIN;D:\Program Files\Microsoft Visual Studio 8\Common7\Tools;D:\Program Files\Microsoft Visual Studio 8\Common7\Tools\bin;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\bin;D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;D:\Program Files\Microsoft Visual Studio 8\VC\VCPackages;%PATH% @set INCLUDE=D:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\INCLUDE;D:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include;D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\include;%INCLUDE% @set LIB=D:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\LIB;D:\Program Files\Microsoft Visual Studio 8\VC\LIB;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib;D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%LIB% @set LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;D:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\LIB
可以根据它们,给VC8、9设置环境变量。
三.3 、使用vcvars32.bat
上面提到vcvars32.bat,它们的位置如下:
VC6 prefix\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
VC8 prefix\Microsoft Visual Studio 8\VC\bin\vcvars32.bat
VC9 prefix\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat
需要注意的是: 这些批处理文件只会在 当前进程中设置(局部的)环境变量,也就是说:
1. 用cmd(或者command)打开的命令行窗口中, 运行某个vcvar32.bat一次。
那么当前命令行窗口中就可以正常使用cl,直到关闭。
2. 写批处理文件需要使用 call prefix\vcvars32.bat,而不是直接启动vcvars32.bat。
前者为当前进程(cpl.bat创建的进程)添加局部于进程环境变量。
后者启动一个进程, 为其加入环境变量, 然后该进程立即退出——没有任何作用。
三.4、 使用VSXXCOMNTOOLS变量(VC8、9)
对于VC8、9有另一种方式——不注册全局的(系统或当前用户)环境变量,仅为当前进程设置(局部的)环境变量。
因为VC8、9都可以 很方便的为单个进程设置环境变量。
观察vc8和vc9的vcvars32.bat的内容(位置见上), 发现它们都只有一行:
"%V S80COMNTOOLS%v svars32.bat"
"%V S90COMNTOOLS%v svars32.bat"
VS80COMNTOOLS、VS90COMNTOOLS(注意不是VC而是VS)分别是VS2005和VS2008安装后会设置的环境变量。
所以我们也可以在自己的批处理中,很方便的为当前进程设置需要的环境变量。如下:
call " %VS80COMNTOOLS%vsvars32.bat"
以下cl命令将执行VC8的cl。
call " %VS90COMNTOOLS%vsvars32.bat"
以下cl命令将执行VC9的cl。
四、 总结
如果仅需要使用某个版本的VC, 并且只为自己方便而使用命令行, 可以使用上面任何一种方式。
简单归纳如下:
1、 使用全局环境变量——在系统或当前用户变量中加入需要的值。
1.1 重新安装
1.2 手工加入
2、 不使用全局环境变量
——在执行cl前,先使用对应的vcvars32.bat(命令行窗口中执行或者脚本中call prefix\vcvars32.bat)。
2.1 将vcvars32.bat加入Path变量
2.2 使用"%V S XXCOMNTOOLS%v svars.bat" (VC8、9) 或者 absolutePath\vcvars32.bat
如果需要使用多个版本的VC、 或者需要将编译脚本发布给客户使用, 就不能这么随意了。