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" 浮点模型;结果可预测性比较低
...