【问题标题】:No CMAKE_C_COMPILER could be found due to CompilerIdCXX.vcxproj in Debug for a Release build由于发布版本的调试中的 CompilerIdCXX.vcxproj,找不到 CMAKE_C_COMPILER
【发布时间】:2020-08-13 11:14:02
【问题描述】:

我最近遇到了一个奇怪的问题(上周有效,但我不明白发生了什么变化)

像往常一样,我使用以下命令行运行 cmake,以便在 Windows 上使用 Visual Studio 2019 工具为某些 c 或 c++ 库配置发布版本:

cmake "./Sources" -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Release -DCMAKE_GENERATOR_PLATFORM=x64 -DCMAKE_INSTALL_PREFIX="./Build" -DCMAKE_C_FLAGS="-DNDEBUG -MT -Ob2 -O2 -FS"

但是几天后,我尝试的每个发布版本都会收到此错误:

-- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.18363.
-- The C compiler identification is unknown
CMake Error at CMakeLists.txt:1 (PROJECT):
  No CMAKE_C_COMPILER could be found.

-- Configuring incomplete, errors occurred!

进一步调查表明,问题来自 cmake 用于检查编译器的工具,不知何故,它似​​乎不关心 -DCMAKE_BUILD_TYPE=Release 参数,并尝试将其编译为 Debug 版本。我在 CMakeError.log 中找到了这个:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.26.28801\bin\HostX64\x64\CL.exe /c /nologo /W0 /WX- /diagnostics:column /Od /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc142.pdb" /Gd /TP /FC /errorReport:queue CMakeCXXCompilerId.cpp

Build FAILED.

"C:\cpplibs\Intermediate\JsonCpp\1.9.3\Windows\x64\Release\CMakeFiles\3.17.20032601-MSVC_2\CompilerIdCXX\CompilerIdCXX.vcxproj" (default target) (1) ->
(ClCompile target) ->
  cl : command line warning D9025: overriding '/MDd' with '/MT' [C:\cpplibs\Intermediate\JsonCpp\1.9.3\Windows\x64\Release\CMakeFiles\3.17.20032601-MSVC_2\CompilerIdCXX\CompilerIdCXX.vcxproj]
  cl : command line warning D9025: overriding '/Od' with '/O2' [C:\cpplibs\Intermediate\JsonCpp\1.9.3\Windows\x64\Release\CMakeFiles\3.17.20032601-MSVC_2\CompilerIdCXX\CompilerIdCXX.vcxproj]"C:\cpplibs\Intermediate\JsonCpp\1.9.3\Windows\x64\Release\CMakeFiles\3.17.20032601-MSVC_2\CompilerIdCXX\CompilerIdCXX.vcxproj" (default target) (1) ->
(ClCompile target) ->
  cl : command line error D8016: '/RTC1' and '/O2' command-line options are incompatible [C:\cpplibs\Intermediate\JsonCpp\1.9.3\Windows\x64\Release\CMakeFiles\3.17.20032601-MSVC_2\CompilerIdCXX\CompilerIdCXX.vcxproj]

我还打开了生成的 CompilerIdCXX.vcxproj,它只包含一个调试配置,而我要求一个发布版本!因此,这解释了为什么会覆盖多个编译器选项,特别是为什么 /RTC1 存在并声明与 /O2 等预期版本选项不兼容...

我也在我的同事计算机上尝试过,对于其他纯“c”语言的库,它生成一个 CompilerIdC.vcxproj 项目,结果是一样的,因为几天前它就像一个魅力一样工作。

有没有人知道如何让 cmake 恢复正常行为以配置发布版本?

【问题讨论】:

  • 您说这曾经有效,但现在无效。您使用的是哪个版本的 CMake?

标签: windows cmake visual-studio-2019


【解决方案1】:

好的,我明白了,

实际上在配置步骤中使用此命令:

cmake "./Sources" -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Release -DCMAKE_GENERATOR_PLATFORM=x64 -DCMAKE_INSTALL_PREFIX="./Build" -DCMAKE_C_FLAGS="-DNDEBUG -MT -Ob2 -O2 -FS"

运行了很多 cl 命令,但这些只是用于测试平台功能。即使我们要求最终版本构建,它们也包含许多硬编码的调试标志。他们不编译最终程序中使用的东西,他们只是允许测试某些功能在当前环境中是否可用。在这一步覆盖一些标志并不是我真正想要的,它只是在下一步有用。

如果我在没有标志覆盖的情况下运行命令(在 CL env var 中),我可以运行这个 cmake 行而不再出现问题。

解决了!

【讨论】:

    【解决方案2】:

    这部分 CMake 命令行看起来很可疑:

    -DCMAKE_C_FLAGS="-DNDEBUG -MT -Ob2 -O2 -FS"
    

    这些编译选项看起来更像 GCC 样式,而不是 Visual Studio 编译器接受的编译选项(以 / 开头)。考虑删除它,或修改它以应用 Visual Studio 编译器的适当编译选项。这样做时,您应该避免手动操作CMAKE_C_FLAGS 变量,因为这是一种不鼓励的做法。相反,请尝试在顶级 CMakeLists.txt 文件中使用 add_compile_options 命令。

    此外,您收到的错误似乎表明发生了以下一项或多项:

    • 您的 Visual Studio C 编译器已更新,或未正确安装。检查它是否仍然正确安装,并考虑重新安装它。
    • 您的构建配置不知何故混淆了。清除 CMake 缓存和/或完全删除 CMake 构建文件夹并重新开始总是一个好主意,尤其是在出现此类错误时。您的 CMake 缓存中可能存在一些陈旧或配置错误的变量,从头开始重新运行 CMake 将解决这些问题。

    【讨论】:

    • - 或 / 通常以相同的方式解释,这在这里不会造成任何问题,但我同意,它可以在其他特定情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多