You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake新式构建命令可正常运行但make/Ninja/msbuild构建.sln失败是什么原因?

问题原因解析

1 为什么第一种新式构建方法可以正常运行

cmake -S . -B build + cmake --build build是CMake提供的跨平台通用构建流程,全程不需要你关心底层用的是什么生成器和构建工具:

  • 第一步cmake -S . -B build会自动使用你系统默认的CMake生成器(Windows系统默认是Visual Studio生成器)生成对应构建配置
  • 第二步cmake --build build是CMake封装的统一构建入口,会自动读取生成阶段的配置,自动调用对应构建工具、传入正确的默认参数(比如匹配的配置版本、平台架构),不需要手动适配,所以不会出现参数不匹配的问题。

2 其他方法失败的逐个原因

2.1 手动执行cmake ..后make报错找不到Makefile

Windows系统下CMake默认生成器是Visual Studio的.sln项目,不会生成Makefile文件,直接执行make当然找不到对应文件,所以报错。

2.2 用Ninja生成器编译报_putenv_s未声明错误

这个属于编译器和项目代码的兼容性问题,和CMake无关:你使用的MinGW版本的头文件对Windows系统函数_putenv_s的支持存在缺陷,要么升级/降级MinGW版本,要么切换为MSVC编译器即可解决。

2.3 用MinGW Makefiles生成器报Colon expected错误

MinGW的make工具(通常是mingw32-make)和Visual Studio的nmake语法不兼容,出现这个报错一般是你调用了错误的make程序,或者CMake生成阶段识别错了make工具的路径。

2.4 直接执行msbuild CLI11.sln报错配置无效

Visual Studio生成的sln项目构建时需要显式指定配置和平台参数,你直接执行msbuild没有传参,默认用了Debug|x86配置,但你CMake生成的sln大概率只有x64架构的配置,参数不匹配导致报错。只要补充对应参数即可正常构建:

msbuild CLI11.sln /p:Configuration=Release /p:Platform=x64

3 cmake --build build --target test报错找不到tests.vcxproj的原因

你多次切换生成器的过程中,build目录里残留了之前不同生成器的缓存和配置文件,导致CMake配置混乱,找不到对应测试目标的项目文件。只要清空整个build目录,重新走配置构建流程即可解决。

通用注意事项

  • 每次切换生成器、修改编译配置前,必须完全清空build目录,避免旧缓存干扰
  • 如果不想用默认的Visual Studio生成器,配置阶段要显式指定生成器,比如:
    cmake -S . -B build -G "MinGW Makefiles"
    
  • 优先使用cmake --build的通用构建命令,不用手动适配不同构建工具的参数,避免出错。

内容的提问来源于stack exchange,提问作者Tojmak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:09:01