CMake MSVC编译器选项


CMake 使用MSVC编译器选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.6
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>cl /?
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.16.27026.1 版
版权所有(C) Microsoft Corporation。保留所有权利。 C/C++ 编译器选项 -优化-

/O1 最大优化(优选空间) /O2 最大优化(优选速度)
/Ob 内联扩展(默认 n=0) /Od 禁用优化(默认)
/Og 启用全局优化 /Oi[-] 启用内部函数
/Os 优选代码空间 /Ot 优选代码速度
/Ox 优化(优选速度)
/favor: 选择优化所针对的处理器,为以下值之一:
blend - 针对几种不同 x64 处理器的优化组合
AMD64 - 64 位 AMD 处理器
INTEL64 - Intel(R)64 架构处理器
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 - "fast" 浮点模型;结果可预测性比较低
precise - "precise" 浮点模型;结果可预测
strict - "strict" 浮点模型(意味着 /fp:except)
即使使用 /fp:except,/Qfast_transcendentals 也生成内联内部 FP
/Qspectre[-] 对 CVE 2017-5753 启用缓解措施
/Qpar[-] 启用并行代码生成
/Qpar-report:1 自动并行化诊断;指示已并行化循环
/Qpar-report:2 自动并行化诊断;指示未并行化循环
/Qvec-report:1 自动向量化诊断;指示已向量化循环
/Qvec-report:2 自动向量化诊断;指示未向量化循环
/GL[-] 启用链接时代码生成 /volatile: 选择可变模型: iso - Acquire/release 语义对可变访问不一定有效 ms - Acquire/release 语义对可变访问一定有效
/GA 为 Windows 应用程序进行优化 /Ge 对所有函数强制堆栈检查
/Gs[num] 控制堆栈检查调用 /Gh 启用 _penter 函数调用
/GH 启用 _pexit 函数调用 /GT 生成纤程安全 TLS 访问
/RTC1 启用快速检查(/RTCsu) /RTCc 转换为较小的类型检查
/RTCs 堆栈帧运行时检查 /RTCu 未初始化的局部用法检查
/clr[:option] 为公共语言运行时编译,其中 option 是:
pure - 生成只包含 IL 的输出文件(没有本机可执行代码)
safe - 生成只包含 IL 的可验证输出文件
initialAppDomain - 启用 Visual C++ 2002 的初始 AppDomain 行为
noAssembly - 不产生程序集 nostdlib - 忽略默认的 \clr 目录
/homeparams 强制将传入寄存器的参数写入到堆栈中
/GZ 启用堆栈检查(/RTCs)
/arch:AVX 允许使用支持 AVX 的 CPU 可用的指令
/arch:AVX2 允许使用支持 AVX2 的 CPU 可用的指令
/Gv __vectorcall 调用约定
(按<回车键>继续) -输出文件-

/Fa[file] 命名程序集列表文件 /FA[scu] 配置程序集列表
/Fd[file] 命名 .PDB 文件 /Fe 命名可执行文件
/Fm[file] 命名映射文件 /Fo 命名对象文件
/Fp 命名预编译头文件 /Fr[file] 命名源浏览器文件
/FR[file] 命名扩展 .SBR 文件 /Fi[file] 命名预处理的文件
/Fd: 命名 .PDB 文件 /Fe: 命名可执行文件
/Fm: 命名映射文件 /Fo: 命名对象文件
/Fp: 命名 .PCH 文件 /FR: 命名扩展 .SBR 文件
/Fi: 命名预处理的文件
/doc[file] 处理 XML 文档注释,并可选择命名 .xdc 文件 -预处理器-

/AI<dir> 添加到程序集搜索路径 /FU 强制使用程序集/模块
/C 不抽出注释 /D{=|#} 定义宏
/E 预处理到 stdout /EP 预处理到 stdout,无行号
/P 预处理到文件 /Fx 将插入的代码合并到文件中
/FI 命名强制包含文件 /U 移除预定义的宏
/u 移除所有预定义的宏 /I<dir> 添加到包含搜索路径
/X 忽略“标准位置” /PH 在预处理时生成 #pragma file_hash -语言-

/std: C++ 标准版 c++14 – ISO/IEC 14882:2014 (默认) c++17 – ISO/IEC 14882:2017 c++latest – 最新草案标准(功能集可更改)
/permissive[-] 使某些非符合代码可编译(功能集可更改)(默认开启)
/Ze 启用扩展(默认) /Za 禁用扩展
/ZW 启用 WinRT 语言扩展 /Zs 只进行语法检查
/Zc:arg1[,arg2] C++ 语言合规性,这里的参数可以是:
forScope[-] 对范围规则强制使用标准 C++
wchar_t[-] wchar_t 是本机类型,不是 typedef
auto[-] 对 auto 强制使用新的标准 C++ 含义
trigraphs[-] 启用三元祖(默认关闭)
rvalueCast[-] 强制实施标准 C++ 显式类型转换规则
strictStrings[-] 禁用从字符串文本到 [char|wchar_t]* 的转换(默认关闭)
implicitNoexcept[-] 在必需的函数上启用隐式 noexcept
threadSafeInit[-] 启用线程安全的本地静态初始化
inline[-] remove unreferenced function or data if it is COMDAT or has internal linkage only (off by default)
sizedDealloc[-] enable C++14 global sized deallocation functions (on by default)
throwingNew[-] 假设运算符 new 在故障时引发(默认关闭)
referenceBinding[-] 临时引用不会绑定到非常数 lvalue 引用(默认关闭)
twoPhase- 禁用两阶段名称查找
ternary[-] 对条件运算符强制使用 C++11 规则(默认关闭)
noexceptTypes[-] 强制执行 C++17 noexcept 规则(在 C++17 或更高版本中默认开启)
alignedNew[-] 对动态分配的对象启用 C++17 对齐方式(默认开启)
/await 启用可恢复函数扩展
/constexpr:depth constexpr 评估的递归深度限制(默认值: 512)
/constexpr:backtrace 在诊断中显示 N constexpr 评估(默认值: 10)
/constexpr:steps 在 N 个步骤后终止 constexpr 评估(默认值: 100000)
/Zi 启用调试信息 /Z7 启用旧式调试信息
/Zo[-] 为优化的代码生成更丰富的调试信息(默认开启)
/ZH:SHA_256 在调试信息(实验)中将 SHA256 用于文件校验和
/Zp[n] 在 n 字节边界上包装结构 /Zl 省略 .OBJ 中的默认库名
/vd{0|1|2} 禁用/启用 vtordisp /vm 指向成员的指针类型
/ZI 启用“编辑并继续”调试信息 /openmp 启用 OpenMP 2.0 语言扩展 - 杂项 -

@ 选项响应文件 /?, /help 打印此帮助消息
/bigobj 生成扩展的对象格式 /c 只编译,不链接
/errorReport:option 将内部编译器错误报告给 Microsoft none - 不发送报告 prompt - 提示立即发送报告 queue - 在下一次管理员登录时,提示发送报告(默认) send - 自动发送报告 /FC 诊断中使用完整路径名
/H 最大外部名称长度 /J 默认 char 类型是 unsigned
/MP[n] 最多使用“n”个进程进行编译 /nologo 取消显示版权信息
/showIncludes 显示包含文件名 /Tc 将文件编译为 .c
/Tp 将文件编译为 .cpp /TC 将所有文件编译为 .c
/TP 将所有文件编译为 .cpp /V 设置版本字符串
/Yc[file] 创建 .PCH 文件 /Yd 将调试信息放在每个 .OBJ 中
/Yl[sym] 为调试库插入 .PCH 引用 /Yu[file] 使用 .PCH 文件
/Y- 禁用所有 PCH 选项 /Zm 最大内存分配(默认值的百分比)
/FS 强制使用 MSPDBSRV.EXE
/source-charset:|.nnnn 集源字符集
/execution-charset:|.nnnn 集执行字符集
/utf-8 集源和到 UTF-8 的执行字符集
/validate-charset[-] 验证 UTF-8 文件是否只有合法字符 -链接-

/LD 创建 .DLL /LDd 创建 .DLL 调试库
/LN 创建 .netmodule /F 设置堆栈大小
/link [链接器选项和库] /MD 与 MSVCRT.LIB 链接
/MT 与 LIBCMT.LIB 链接 /MDd 与 MSVCRTD.LIB 调试库链接
/MTd 与 LIBCMTD.LIB 调试库链接 -代码分析-

/analyze[-] 启用本机分析 /analyze:quiet[-] 没有对控制台的警告
/analyze:log 对文件的警告 /analyze:autolog Log to *.pftlog
/analyze:autolog:ext Log to *./analyze:autolog- 无日志文件
/analyze:WX- 警告不严重 /analyze:stacksize 最大堆栈帧
/analyze:max_paths 最大路径 /analyze:only Analyze, no code gen -诊断-

/diagnostics: 控制诊断消息的格式: 传统型 - 保留之前的格式 列[-] - 打印列信息 插入点[-] - 打印列和源的指示行
/Wall 启用所有警告 /w 禁用所有警告
/W 设置警告等级(默认 n=1)
/Wv:xx[.yy[.zzzzz]] 禁用在 xx.yy.zzzzz 版本后引入的警告功能
/WX 将警告视为错误 /WL 启用单行诊断
/wd 禁用警告 n /we 将警告 n 视为错误
/wo 发出一次警告 n /w 为 n 设置警告等级 1-4
/external:I – 外部标头的位置
/external:env: – 外部标头位置的环境变量
/external:anglebrackets– 将所有通过 <> 包含的标头视为外部
/external:W – 外部标头的警告级别
/external:templates[-] – 跨模板实例化链评估警告级别
/sdl 支持其他安全功能和警告

按类别列出的编译器选项

优化

选项 目标
/O1 创建小代码。
/O2 创建快速代码。
/Ob 控制内联展开。
/Od 禁用优化。
/Og 已弃用。 使用全局优化。
/Oi 生成内部函数。
/Os 代码大小优先。
/Ot 代码速度优先。
/Ox 不包含/GF 或/Gy. 的/O2 子集
/Oy 省略帧指针。 (仅限 x86)
/favor 生成针对一个指定体系结构或一系列体系结构进行优化的代码。

代码生成

选项 目标
/arch 使用 SSE 或 SSE2 指令生成代码。 (仅限 x86)
/clr 生成要在公共语言运行时上运行的输出文件。
/EH 指定异常处理模型。
/fp 指定浮点行为。
/GA 针对 Windows 应用程序进行优化。
/Gd 使用 __cdecl 调用约定。 (仅限 x86)
/Ge 已弃用。 激活堆栈探测。
/GF 启用字符串池。
/Gh 调用挂钩函数 _penter
/GH 调用挂钩函数 _pexit
/GL 启用全程序优化。
/Gm 已弃用。 启用最小重新生成。
/GR 启用运行时类型信息 (RTTI)。
/Gr 使用 __fastcall 调用约定。 (仅限 x86)
/GS 检查缓冲区安全性。
/Gs 控制堆栈探测。
/GT 支持使用静态线程本地存储分配的数据的纤程安全。
/guard:cf 添加控制流防护安全检查。
/guard:ehcont 启用 EH 继续元数据。
/Gv 使用 __vectorcall 调用约定。 (仅限 x86 和 x64)
/Gw 启用全程序全局数据优化。
/GX 已弃用。 启用同步异常处理。 改为使用 /EH
/Gy 启用函数级链接。
/GZ 已弃用。 启用快速检查。 与) (相同 /RTC1
/Gz 使用 __stdcall 调用约定。 (仅限 x86)
/homeparams 强制将传入寄存器的参数写入其在函数入口的堆栈上的位置。 此编译器选项仅适用于 x64 编译器 (本机编译和跨平台编译) 。
/hotpatch 创建可热修补的映像。
/Qfast_transcendentals 生成快速先验。
/QIfist 已弃用。 当需要从浮点型转换为整型时,取消调用 Helper 函数 _ftol 。 (仅限 x86)
/Qimprecise_fwaits 删除 fwait 块内 try 的命令。
/QIntel-jcc-erratum 缓解 Intel JCC 错误微代码更新对性能的影响。
/Qpar 启用循环的自动并行化。
/Qpar-report 启用自动并行化的报告级别。
/Qsafe_fp_loads 将整数移动指令用于浮点值,并禁用特定浮点加载优化。
/Qspectre 为 CVE 2017-5753 启用缓解,适用于一类 Spectre 攻击。
/Qspectre-load 为每个加载指令生成序列化说明。
/Qspectre-load-cf 为每个加载内存的控制流指令生成序列化说明。
/Qvec-report 启用自动矢量化的报告级别。
/RTC 启用运行时错误检查。
/volatile 选择如何解释 volatile 关键字。

输出文件

选项 目标
/doc 将文档注释处理到一个 XML 文件中。
/FA 配置程序集列表文件。
/Fa 创建程序集列表文件。
/Fd 重命名程序数据库文件。
/Fe 重命名可执行文件。
/Fi 指定预处理输出文件名。
/Fm 创建映射文件。
/Fo 创建对象文件。
/Fp 指定预编译头文件名。
/FR, /Fr 名称生成 .sbr 的浏览器文件。

预处理器

选项 目标
/AI 指定在解析传递到 #using 指令的文件引用时搜索的目录。
/C 在预处理期间保留注释。
/D 定义常数和宏。
/E 将预处理器输出复制到标准输出。
/EP 将预处理器输出复制到标准输出。
/FI 预处理指定的包含文件。
/FU 强制使用文件名,就像它已被传递到 #using 指令一样。
/Fx 将插入的代码与源文件合并。
/I 在目录中搜索包含文件。
/P 将预处理器输出写入文件。
/U 移除预定义宏。
/u 移除所有的预定义宏。
/X 忽略标准包含目录。

语言

选项 目标
/constexpr constexpr 在编译时控制计算。
/openmp #pragma omp在源代码中启用。
/vd 取消或启用隐藏的 vtordisp 类成员。
/vmb 对指向成员的指针使用最佳的基。
/vmg 对指向成员的指针使用完全一般性。
/vmm 声明多重继承。
/vms 声明单一继承。
/vmv 声明虚拟继承。
/Z7 生成与 C 7.0 兼容的调试信息。
/Za 禁用 C89 语言扩展。
/Zc 指定下的标准行为 /Ze
/Ze 已弃用。 启用 C89 语言扩展。
/Zf 在并行生成中改善 PDB 生成时间。
/ZH 为调试信息中的校验和指定 MD5、SHA-1 或 SHA-256。
/ZI 将调试信息包含在与“编辑并继续”兼容的程序数据库中。 (仅限 x86)
/Zi 生成完整的调试信息。
/Zl 删除文件中的默认库名称 .obj
/Zpn 封装结构成员。
/Zs 只检查语法。
/ZW 生成要在 Windows 运行时上运行的输出文件。

链接

选项 目标
/F 设置堆栈大小。
/LD 创建动态链接库。
/LDd 创建调试动态链接库。
/link 将指定的选项传递给 LINK。
/LN 创建 MSIL 模块。
/MD 使用 msvcrt.lib 编译以创建多线程 DLL。
/MDd 使用 msvcrtd.lib 编译以创建调试多线程 DLL。
/MT 使用 libcmt.lib 编译以创建多线程可执行文件。
/MTd 使用 libcmtd.lib 编译以创建调试多线程可执行文件。

杂项

选项 目标
/? 列出编译器选项。
@ 指定响应文件。
/analyze 启用代码分析。
/bigobj 增加 .obj 文件中可寻址节的数目。
/c 编译但不链接。
/cgthreads 指定用于优化和代码生成的 cl.exe 线程数。
/errorReport 已弃用。 错误报告由 Windows 错误报告 (WER) 设置控制。
/FC 在诊断文本中显示传递给 cl.exe 的源代码文件的完整路径。
/FS 强制写入 PDB 文件,以便通过 MSPDBSRV.EXE 进行序列化。
/fsanitize 启用 sanitizer 检测的编译,如 AddressSanitizer。
/H 已弃用。 限制外部(公共)名称的长度。
/HELP 列出编译器选项。
/J 更改默认 char 类型。
/JMC 支持本机 c + + 仅我的代码调试。
/kernel 编译器和链接器将创建可在 Windows 内核中执行的二进制文件。
/MP 同时生成多个源文件。
/nologo 取消显示登录版权标志。
/sdl 启用更多安全功能和警告。
/showIncludes 在编译期间显示所有包含文件的列表。
/sourceDependencies 列出标头、模块和其他源依赖项。
/Tc 指定 C 源文件。
/TC 指定所有源文件均为 C。
/Tp 指定 C++ 源文件。
/TP 指定所有源文件均为 c + +。
/V 已弃用。 设置版本字符串。
/w 禁用所有警告。
/W0, /W1, /W2, /W3, /W4 设置输出警告级别。
/w1, /w2, /w3, /w4 针对指定的警告设置警告级别。
/Wall 启用所有警告,包括默认情况下禁用的警告。
/wd 禁用指定的警告。
/we 将指定的警告视为错误。
/WL 在从命令行编译 C++ 源代码时启用错误消息和警告消息的单行诊断。
/wo 仅显示指定的警告一次。
/Wv 禁用更高版本的编译器引入的警告。
/WX 将警告视为错误。
/Yc 创建 .PCH 文件。
/Yd 已弃用。 将完整的调试信息放在所有对象文件中。 改为使用 /Zi
/Yl 创建调试库时插入 PCH 引用。
/Yu 在生成期间使用预编译头文件。
/Y- 忽略当前生成中的所有其他预编译头编译器选项。
/Zm 指定预编译头内存分配限制。
/await ) 扩展启用协同程序 (可恢复的函数。
/source-charset 设置源字符集。
/execution-charset 设置执行字符集。
/utf-8 将源和执行字符集设置为 UTF-8。
/validate-charset 仅验证 UTF-8 文件的兼容字符。
/diagnostics 控制诊断消息的格式。
/permissive- 设置标准一致性模式。
/std C + + 标准版本兼容性选择器。

实验性选项

实验性选项只能由某些版本的编译器支持。 它们在不同的编译器版本中也可能具有不同的行为。 对于试验性选项,通常是最好的文档,也是 Microsoft c + + 团队博客

选项 目标
/experimental:module 启用实验性模块支持。
/experimental:preprocessor 已弃用。 启用实验相容预处理器支持。 使用 /Zc:preprocessor

弃用并删除的编译器选项

选项 目标
/clr:noAssembly 已弃用。 改用/LN (创建 MSIL 模块)
/errorReport 已弃用。 错误报告由 Windows 错误报告 (WER) 设置控制。
/Fr 已弃用。 创建无局部变量的浏览信息文件。
/Ge 已弃用。 激活堆栈探测。 默认已启用。
/Gm 已弃用。 启用最小重新生成。
/GX 已弃用。 启用同步异常处理。 改为使用 /EH
/GZ 已弃用。 启用快速检查。 改为使用 /RTC1
/H 已弃用。 限制外部(公共)名称的长度。
/Og 已弃用。 使用全局优化。
/QIfist 已弃用。 曾用来指定如何从浮点类型转换到整型类型。
/V 已弃用。 设置 .obj 文件版本字符串。
/Wp64 已过时。 检测 64 位可移植性问题。
/Yd 已弃用。 将完整的调试信息放在所有对象文件中。 改为使用 /Zi
/Zc:forScope- 已弃用。 在 for 循环范围中禁用一致性。
/Ze 已弃用。 启用语言扩展。
/Zg 在 Visual Studio 2015 中移除。 生成函数原型。

另请参阅

C/c + + 生成参考
MSVC 编译器选项
[MSVC 编译器命令行语法](

相关参考

Microsoft C/C++ 编译器选项