VS常见编译选项总结
UEFI工程中的tools_def.txt就设置了不同版本VS编译器的C默认全局编译选项,以2015为例,分Debug/Release/NOOPT三种进行描述:
DEBUG_VS2015_IA32_CC_FLAGS = /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Z7 /Gw
RELEASE_VS2015_IA32_CC_FLAGS = /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gw
NOOPT_VS2015_IA32_CC_FLAGS = /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Z7 /Od
这些编译选项在各大工程中经常会遇到,但其具体代表什么意思呢?
下面one by one的解释/总结下:
Option | Purpose |
---|---|
/nologo | 编译的过程中不显示编译器版本信息 |
/arch | 指定编译产生何种架构的汇编指令,X64 or IA32 or ARM |
/c | 在编译过程中只会产生.obj文件,不会隐性的链接库文件;如果要链接,需要显性使用/LINK |
/WX | 将编译过程产生的所有警告均视为错误 |
/GS- | 不去做Buffer Security Check/堆栈安全性检查 |
W4 | 编译过程中会打印level4/最高级别的waring message |
/Gs[size] | 针对c function加入size大小的堆栈探针,以应对局部变量所需空间的不足 |
/D | 编译进预处理的符号,类似工程的宏 |
/O1b2 | =/O1 /Ob2 优化选项,采用最小空间代码编译以及展开内嵌函数 |
/GL | 使能代码整体优化 |
/FI[ ]pathname | 强制包含pathname下的头文件 |
/EHs-c- | 不会忽略structured和C++异常 |
GR- | 禁止runtime类型的object types检查 |
/GF | 将相同的string放在同一块mem地址上 |
/Gy | 允许编译器打包function |
/Z7 | 编译生成的.obj包含所有的debug symbols |
/Gw | 允许编译器打包global data |
其他的编译选项可在微软的Compiler Options中查询:
每一种编译选项所造成的具体差异,还有待在工程实践中逐一探索,thks!