正确写法是:在新建构建目录中执行cmake -g "visual studio 17 2022" -a x64 ..(需指定生成器-g和架构-a),否则默认不生成.sln;cmakelists.txt必须含project()、add_executable()等必要指令,且源文件路径须真实存在。

cmake命令行生成VS工程的正确写法
直接用 cmake 命令就能生成 Visual Studio 的 .sln 和 .vcxproj 文件,但必须指定生成器(generator),否则默认生成 Unix Makefiles 或 Ninja,根本不会输出 VS 工程。
常见错误是只运行 cmake .,结果发现目录里只有 CMakeFiles 和 Makefile,完全没出现 .sln —— 这是因为没告诉 CMake 你要 VS。
- 查可用生成器:运行
cmake -G(不带参数),会列出所有支持的 generator,Windows 上典型的是"Visual Studio 17 2022"、"Visual Studio 16 2019" - 生成 64 位工程(推荐):
cmake -G "Visual Studio 17 2022" -A x64 ..(注意-A x64指定架构,不加可能默认 Win32) - 生成 32 位工程:
cmake -G "Visual Studio 17 2022" -A Win32 .. - 务必在新建的构建目录中执行(如
mkdir build && cd build),不要在源码根目录直接cmake .,否则会污染源码树
CMakeLists.txt里必须写的最低配置
VS 工程能生成出来,不代表能编译通过。CMakeLists.txt 至少要声明项目名、语言标准和可执行文件/库,否则 VS 打开后会报错“no target”或“no source files”。
一个最小但可工作的例子:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
cmake_minimum_required(VERSION 3.10) project(MyApp LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(MyApp main.cpp)
-
project()必须有,且LANGUAGES CXX显式声明 C++,否则 VS 可能识别为 C 项目,导致std::string等类型报错 -
add_executable()的第二个参数必须是真实存在的源文件路径(相对 CMakeLists.txt),VS 不会自动扫描*.cpp,漏写就生成空项目 - 如果用了第三方头文件(比如
#include <fmt></fmt>),仅靠add_executable不够,必须用find_package(fmt REQUIRED)+target_link_libraries(MyApp fmt::fmt),否则 VS 加载后编译直接失败
生成后在VS里打不开或提示平台工具集不匹配
生成的 .sln 打不开,或者打开后显示“Unsupported”、“The build tools for v143 cannot be found”,本质是 CMake 生成时绑定的平台工具集(toolset)和本机安装的 Visual Studio 组件不一致。
- 检查本机已安装的工具集:打开 VS Installer → 修改当前 VS → “单独组件”里搜 “MSVC v143”(对应 VS 2022)、“v142”(VS 2019)
- 强制指定工具集生成:
cmake -G "Visual Studio 17 2022" -T v143 -A x64 ..(-T参数必须紧接-G后,顺序不能错) - 如果机器只装了 Community 版,但 CMake 默认找 Enterprise 的 SDK 路径,可能报错
WindowsSdkNotFound;此时加-DCMAKE_SYSTEM_VERSION="10.0.19041.0"显式指定 SDK 版本(查注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows可确认) - VS 版本升级后(比如从 17.5 升到 17.8),旧生成的 .sln 可能无法加载,必须重新运行
cmake,不能复用
为什么生成的工程里没有资源文件或自定义生成步骤
CMake 默认只处理源码和链接逻辑,VS 里的资源(.rc)、自定义生成工具(.idl、.def)、预编译头(stdafx.h)等,必须显式声明,否则它们在 .vcxproj 中完全不可见。
- 添加资源文件:
source_group("Resource Files" FILES myapp.rc)+target_sources(MyApp PRIVATE myapp.rc) - 启用预编译头:
set_target_properties(MyApp PROPERTIES VS_WINRT_COMPONENT TRUE)不对——正确做法是target_precompile_headers(MyApp PRIVATE "stdafx.h")(CMake 3.16+) - 自定义生成(如 .idl 编译):需用
add_custom_command()和add_custom_target()配合target_sources()注入输出文件,否则 VS 不知道该调用 midl.exe - VS 的“属性页”配置(如 /MP 并行编译、/bigobj)不能靠 GUI 手动设,应统一用
target_compile_options(MyApp PRIVATE /MP)或set_property(TARGET MyApp PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
生成 VS 工程不是终点,而是把 CMake 的抽象逻辑落地成 VS 能理解的项目结构;漏掉任何一项显式声明,都会导致 VS 表现异常——它不会猜你要什么,只会严格按 CMake 输出的内容加载。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










