从普通命令行使用Visual Studio的“ cl”

从普通命令行使用Visual Studio的“ cl”

Using Visual Studio's 'cl' from a normal command line

Visual Studio 2003和2005(就我所知,也许还有2008)要求命令行用户在" Visual Studio命令提示符"中运行。 启动此命令提示符时,它将设置C ++编译器cl在编译时使用的各种环境变量。

这并不总是可取的。 例如,如果我想从Ant内部运行" cl",我想避免不得不从" Visual Studio命令提示符"内部运行Ant。 不能选择运行vcvars32.bat,因为在运行cl时(如果从Ant内部运行),由vcvars32.bat设置的环境将丢失。

是否有一种简单的方法可以运行cl,而不必从Visual Studio命令提示符下运行?


就像任何其他编译器一样,可以从命令行(或makefile)使用这些编译器。您需要注意的主要事情是INCLUDE和LIB环境变量以及PATH。如果从cmd.exe运行,则只需运行以下.bat即可设置环境:

C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\vcvarsall.bat

如果您尝试使用Makefile,Cygwin,MinGW或类似文件中的编译器,则需要手动设置环境变量。假设编译器安装在默认位置,则该方法适用于Visual Studio 2008编译器和最新的Windows SDK:

添加到PATH:

  • C:\ Program Files \ Microsoft SDKs \ Windows \ v6.1 \ Bin
  • C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ Bin
  • C:\ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE

添加到包含:

  • C:\ Program Files \ Microsoft SDKs \ Windows \ v6.1 \ Include
  • C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include
  • C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ atlmfc \ include

新增至LIB:

  • C:\ Program Files \ Microsoft SDKs \ Windows \ v6.1 \ Lib
  • C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ lib

这些是最低限度的要求,但对于基本事物来说应该足够了。研究vcvarsall.bat脚本以了解您可能还要设置的内容。


创建您自己的批处理文件(例如clenv.bat),然后调用它而不是cl:

1
2
3
4
5
@echo off
:: Load compilation environment
call"C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\vcvarsall.bat"
:: Invoke compiler with any options passed to this batch file
"C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\bin\\cl.exe" %*

现在可以像cl.exe一样调用clenv.bat,只不过它会先加载所需的环境变量。


您只需运行批处理文件即可自行设置变量。在VS08中,它位于:-

1
C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\vcvarsall.bat

vcvars32或vsvars32批处理文件所做的不是火箭科学。他们只是将PATH,INCLUDE,LIB以及可能的LIBPATH环境变量设置为特定编译器版本的明智默认值。

您要做的就是确保为Ant或makefile正确设置了这些内容(在调用它们之前或在其中)。

对于INCLUDE和LIB / LIBPATH,在环境变量中设置这些项目的另一种方法是将这些设置作为显式参数传递给命令行。


诀窍是始终使用正确的vcvars批处理文件。如果您只安装了Visual Studio的一个版本,那不是什么大问题。如果您正在处理像我这样的多个版本,则在使用MSVC ++ 15 vcvars文件设置的控制台中运行MSVC ++ 14构建变得非常容易。它可能会也可能不会,但是无论您得到什么,都将与在VisualStudio中构建的内容有所不同。

我们通过从选定的编译器派生适当的vcvars文件并始终在工具调用内部设置环境的方式来解决terp中的问题。这样,对于使用的编译器,您始终拥有正确的vcvars文件。

只是重申一下:我强烈建议您不要尝试手动复制vcvars文件为您执行的操作。您肯定会错过某些东西或将其恰到好处地使它看起来像在工作,而实际上却在做与您想要的略有不同的事情。


由Visual Studio命令提示符运行的vcvarsall.bat批处理文件只是试图使您的系统环境变量和路径保持整洁(这对您有多个版本的Visual Studio非常重要)。

如果您很乐意将安装程序限制为一个版本,并且环境变量的路径和路径较长,请将这些设置(手动)转移到系统环境变量("我的电脑" |"属性"-或Win-Pause / Break)。

我还是建议不要这样做!


我在visual-studio-2010中打开Visual Studio Command Prompt的Visual Studio命令行的版本。 在内部用于构建库/项目,然后对生成的DLL文件执行一些额外的步骤。

将这些行复制到您的Compile and execute other steps.cmd文件或类似文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off

REM Load Visual Studio's build tools
call"%ProgramFiles(x86)%\\Microsoft Visual Studio 10.0\\VC\\vcvarsall.bat" x86

REM Choose what you want to do, 1 or 2 by (un)commenting

REM     1. Add your cl.exe (or msbuild.exe or other) commands here
REM msbuild.exe MyProject.csproj
REM cl.exe
REM custom-step.exe  %*
REM pause

REM     2. Open a normal interactive system command shell with all variables loaded
%comspec% /k

在此版本的脚本中,此后我将"停留"在交互式命令行模式下。 注释REM %comspec% /k仅将脚本用于非交互目的。


推荐阅读

    linux命令删除用户组?

    linux命令删除用户组?,管理,密码,系统,用户组,用户,概念,命令,文件,管理员,

    linux运行图形界命令?

    linux运行图形界命令?,系统,密码,地址,电脑,图形界面,地方,工具,界面,终端,

    linux怎样运行命令?

    linux怎样运行命令?,系统,工作,信息,基础,地址,命令,目录,工具,密码,一致,Lin

    开机启动命令linux?

    开机启动命令linux?,软件,标准,环境,工作,设备,系统,名称,情况,电脑,位置,lin

    纯命令行linux服务器?

    纯命令行linux服务器?,密码,服务,系统,命令,终端,地址,百度,情况,状态,公共,

    linux设置命令行长度?

    linux设置命令行长度?,系统,工作,信息,地址,命令,工具,异常,管理,目录,文件,l

    linux命令行和关机?

    linux命令行和关机?,系统,工作,标准,状态,命令,管理,设备,时间,信息,目录,lin

    linux编译完运行命令?

    linux编译完运行命令?,系统,代码,环境,工具,信息,命令,文件,程序,终端,编辑,

    linux中同步命令行?

    linux中同步命令行?,时间,系统,服务,图片,统一,中国,信息,命令,界面,硬件,LIN

    linux启动sh命令?

    linux启动sh命令?,工作,系统,代码,服务,脚本,文件,命令,目录,方法,权限,Linux

    linuxvim命令行?

    linuxvim命令行?,系统,代码,模式,入口,基础,环境,命令,文件,编辑,文本,Linux

    linux命令行退出系统?

    linux命令行退出系统?,系统,工作,时间,地址,信息,命令,软件,工具,发行,电脑,

    linux提交程序命令行?

    linux提交程序命令行?,工作,系统,信息,地址,工程,目录,管理,环境,命令,功能,L

    linux复制几行命令行?

    linux复制几行命令行?,系统,位置,基本知识,设备,软件,文件,命令,源文件,连

    linux命令程序运行?

    linux命令程序运行?,状态,系统,服务,情况,命令,进程,软件,数据,发行,时间,Lin

    linux本地ip命令行?

    linux本地ip命令行?,地址,网络,系统,信息,电脑,状态,中心,设备,名称,数字,查

    linux中用户创建命令?

    linux中用户创建命令?,密码,系统,用户,软件,命令,联系方式,管理,信息,用户

    linux设备加载命令行?

    linux设备加载命令行?,设备,系统,信息,数字,首页,软件,密码,终端,文件,键盘,L

    linux清理内存命令行?

    linux清理内存命令行?,策略,数据,系统,名称,不了,管理,情况,工作,一致,时间,l

    输入linux命令行参数?

    输入linux命令行参数?,工作,系统,地址,数据,流程,电脑,信息,命令,工具,管理,l