MSVC - CL 工具配置使用

15 Dec 2020

tools

最近,在配置 CLion MSVC 编译器环境时,产生了一个疑问:如何使用 MSVC 环境在命令行中对源代码进行编译。经过查询相关资料,发现 MSVC 自带一个 CL 工具,即是命令行下的编译程序。这里记录一下对其的相关配置和使用。

系统环境 §

  • Windows 10 2004
  • Visual Studio 2017(需要安装通用 Windows 平台开发使用 C++ 的桌面开发两个模块)

添加环境变量 §

需要注意的是,以下环境变量均为系统环境变量,而非用户环境变量

样例目录路径可能与你的不同,请自行调整

Path 变量 §

Path 变量中,添加 cl.exe 所在目录。e.g. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86

INCLUDE 变量 §

若系统环境变量列表中不存在该变量,则创建之

INCLUDE 变量中,添加如下目录

  • C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\cppwinrt
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um
  • C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\winrt

LIB 变量 §

若系统环境变量列表中不存在该变量,则创建之

LIB 变量中,添加如下目录

  • C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x86
  • C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x86
  • C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x86

重启终端 §

在完成上述步骤后,重启你的终端,就可以开始使用 cl 工具了

C:\Users\Hyperzsb>cl
用于 x86  Microsoft (R) C/C++ 优化编译器 19.16.27043 
版权所有(C) Microsoft Corporation。保留所有权利。

用法: cl [ 选项... ] 文件名... [ /link 链接选项... ]

另一种方法 §

若发觉添加很多环境变量是一个劳神的操作,那么可以直接在已经打开的终端运行 Visual Studio 自带的环境配置脚本进行自动配置

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools>.\VsDevCmd.bat
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.27
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

需要注意的是

  • 脚本的具体位置可能根据版本和安装选项的不同而不同
  • 该配置只对当前命令行有效,在终端窗口关闭后,再次使用需要重新运行该脚本

CL 的使用 §

基本编译 §

C:\Users\Hyperzsb>cl demo.c
用于 x86  Microsoft (R) C/C++ 优化编译器 19.16.27043 
版权所有(C) Microsoft Corporation。保留所有权利。

demo.c
Microsoft (R) Incremental Linker Version 14.16.27043.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:demo.exe
demo.obj

该命令将在当前目录下产生 *.obj 类型的编译中间对象文件和 *.exe 的可执行文件

向指定目录输出编译结果 §

C:\Users\Hyperzsb\CLionProjects\exp-1>cl -Fo"out/demo.obj" -Fe"out/demo.exe" demo.c
用于 x86  Microsoft (R) C/C++ 优化编译器 19.16.27043 
版权所有(C) Microsoft Corporation。保留所有权利。

demo.c
Microsoft (R) Incremental Linker Version 14.16.27043.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:out/demo.exe
out/demo.obj

其他命令行参数 §

其他命令行参数请使用 -? 参数

C:\Users\Hyperzsb\>cl -?
用于 x86  Microsoft (R) C/C++ 优化编译器 19.16.27043 
版权所有(C) Microsoft Corporation。保留所有权利。

             C/C++ 编译器选项


               -优化-

/O1 最大优化(优选空间)                  /O2 最大优化(优选速度)
/Ob<n> 内联扩展(默认 n=0)               /Od 禁用优化(默认)
/Og 启用全局优化                        /Oi[-] 启用内部函数
/Os 优选代码空间                        /Ot 优选代码速度
/Ox 优化(优选速度)                      /Oy[-] 启用帧指针省略
/favor:<blend|ATOM> 选择优化所针对的处理器,为以下值之一:
  blend - 针对几种不同 x86 处理器的优化组合
  ATOM - Intel(R) Atom(TM) 处理器

               -代码生成-

/Gu[-] 确保 distinct 函数具有非重复地址 /Gw[-] 分隔链接器的全局变量
/GF 启用只读字符串池                    /Gm[-] 启用最小重新生成
/Gy[-] 分隔链接器函数                   /GS[-] 启用安全检查
/GR[-] 启用 C++ RTTI                    /GX[-] 启用 C++ EH ( /EHsc 相同)
/guard:cf[-] 启用 CFG (控制流保护)      /EHs 启用 C++ EH (没有 SEH 异常)
/EHa 启用 C++ EH (w/ SEH 异常)          /EHc 外部 "C" 默认为 nothrow
/EHr 始终生成 noexcept 运行时终止检查
/fp:<except[-]|fast|precise|strict> 选择浮点模型:
  except[-] - 在生成代码时考虑浮点异常
  fast - "fast" 浮点模型;结果可预测性比较低
...

参考 §