控制台程序应选console application模板:它自动生成含int main()的main.cpp、链接console子系统、默认支持中文输出;若需完全自定义构建流程(如集成ninja、静态crt、屏蔽crt初始化),则必须选empty project。

选错模板不是“重来一次”那么简单——它可能让你在后续几天反复折腾编译错误、缺失引用、不兼容的 SDK 版本,甚至误入 MFC 或 ATL 的历史坑。关键不是“哪个看起来顺眼”,而是看清楚 main() 是否存在、WinMain() 是否被强制注入、项目是否自带 .vcxproj 还是只生成 CMakeLists.txt。
控制台程序该用 Console Application 还是 Empty Project?
如果你只是跑算法、写工具脚本、验证某个 STL 行为,Console Application 是默认安全选择:它自动生成带 int main() 的 main.cpp,链接 CONSOLE 子系统,输出窗口能正常显示中文(只要控制台编码匹配)。但如果你打算手动管理构建流程、集成 Ninja、或嵌入 Lua 解释器并完全屏蔽 CRT 初始化,那就必须选 Empty Project——它不生成任何源文件,也不预设 SubSystem,所有 linker 选项、预处理器定义、字符集都得你填。
-
Console Application默认启用/MD(动态链接 CRT),若需静态链接,得手动改Configuration Properties > C/C++ > Code Generation > Runtime Library -
Empty Project不创建main.cpp,右键项目 → “添加新项” → 选C++ 文件(.cpp)后,必须手写int main(int argc, char** argv),否则链接时报LNK2019: unresolved external symbol _main - 两者生成的
.vcxproj文件结构不同:Console Application包含<configurationtype>Application</configurationtype>和<subsystem>Console</subsystem>;Empty Project则只有空壳,SubSystem字段初始为空,不填会导致 Windows 下启动黑屏闪退
CMake Project 模板和传统 .vcxproj 项目根本不是一回事
CMake Project 模板不生成 .sln 或 .vcxproj,只生成 CMakeLists.txt 和一个空 main.cpp。VS 后台调用的是本地安装的 CMake(而非 MSBuild),所以你改 Configuration Manager 里的平台没用——真正生效的是 CMakeSettings.json 里写的 configuration 数组。这个模板适合你已经习惯用 cmake -G "Visual Studio 17 2022" -A x64 命令行的人,或者团队要求统一用 CMake 管理跨平台构建。
Visual Studio 18.8.1 官方固定版本安装引导程序,当前条目使用微软发布历史中的 Professional Web Installer,适合旧项目兼容、环境回退、复现特定构建链和排查版本差异等场景。
- 若未安装 “CMake tools for Visual Studio” 工作负载,新建后会直接报错:
CMake executable not found - 修改
CMakeLists.txt后,VS 不会自动 reconfigure——必须点工具栏的全部重新生成或右键 CMake 根节点选重新生成 CMake 缓存 - 调试时断点可能不命中:因为 VS 默认用
launch.vs.json启动,但 CMake 项目实际由cmake --build产物驱动,需确认target名与executable路径一致
Win32 GUI 项目别乱点 Windows Desktop Application
Windows Desktop Application 模板生成的是纯 Win32 API 窗口程序,入口是 WinMain(),消息循环、RegisterClassEx、CreateWindowEx 全都写好了。但它默认使用 Unicode 字符集 + 多字节混合模式(/utf-8 未启用),如果代码里硬写 L"Hello" 却忘了 #define UNICODE,编译会卡在 CreateWindowExW 找不到符号。更隐蔽的问题是:它默认关闭了 SDL checks(安全开发生命周期检查),而现代项目通常需要开启 /GS 和 /guard:cf。
- 若你实际想用 WPF 或 WinForms,千万别选这个——它们属于 .NET 生态,对应模板是
WPF Application或Windows Forms App (.NET Framework),底层完全不碰 Win32 - 若你勾选了 “使用 ATL” 或 “使用 MFC”,模板就变成
MFC Application,项目会引入大量宏和类库,stdafx.h和预编译头机制会强制启用,关不掉 - 该模板生成的资源文件(
.rc)默认编码是系统 ANSI,遇到中文菜单或对话框文字,容易在非中文 Windows 上显示乱码,需手动把.rc文件另存为 UTF-8 with BOM
最常被忽略的一点:模板一旦选定,ProjectType 和 TargetFramework(或 PlatformToolset)就锁死了。比如用 Console Application 创建的项目,默认 PlatformToolset 是 v143(VS 2022),但如果你后期想切到 v142(VS 2019),光改下拉菜单不行,还得手动编辑 .vcxproj 里所有 <platformtoolset></platformtoolset> 节点,否则构建时会静默降级失败。










