我使用 CLion 2022.2、Visual Studio 2022 和 CMake 3.23。我想使用版本 14.31.17.1 的工具集,该版本比最新版本旧。
我使用
CMakeLists.txt
文件配置 CMake 项目
project(test_project)
add_executable(test_project main.cpp)
在 CLion 中,我指定生成器 Visual Studio 2022 和工具集 14.31.17.1。执行的命令是
"C:\Program Files\CMake\bin\cmake.exe" -G "Visual Studio 17 2022" -T version=14.31.17.1 -S F:\test_project -B F:\test_project\build
尽管如此,日志说
-- The C compiler identification is MSVC 19.33.31629.0
-- The CXX compiler identification is MSVC 19.33.31629.0
当我清除缓存目录并在 CLion 终端中执行相同的命令(使用
.
或 &
前缀复制并粘贴)时,我得到了我想要的
-- The C compiler identification is MSVC 19.31.31107.0
-- The CXX compiler identification is MSVC 19.31.31107.0
注意:工具集 14.31.31103 包含 MSVC 19.31.31107.0,而工具集 14.33.31629 包含 MSVC 19.33.31629.0。所以我断定出了问题。
此后,我可以修改项目并执行“重新加载CMake项目”,CLion做得很好,因为编译器的版本已经配置好了。
为工具链指定 C 和 C++ 编译器(文件 | 设置 | 构建、执行、部署 | 工具链)没有帮助。
当我使用 Visual Studio 安装程序删除最新的工具集时,它还会自动删除适用于 Windows 的 C++ CMake 工具,这不允许我将 CMake 与 Visual Studio 一起使用。
我的
main.cpp
文件是
#include <iostream>
int main() {
std::cout << _MSC_VER << std::endl;
return 0;
}
当我配置项目(无论使用 CLion 还是手动)并使用 CLion GUI 构建它时,我得到了答案
1933
虽然,如果我使用与 CLion 相同的命令,即
"C:\Program Files\CMake\bin\cmake.exe" --build F:\test_project\build --target test_project --config Debug
我得到了我需要的东西
1931
奇怪的是,即使在使用 CLion GUI 配置项目后,我也使用终端得到了正确的结果。另外,我可以在终端中设置项目以使用较新的工具集(这是默认设置)并打印
1933
。
此外,当我使用 CLion 调试代码时,Evaluate 表示
_MSC_VER
是 1933
,但应用程序仍然打印 1931
。当我创建变量 int x{_MSC_VER};
时,调试器显示 x
等于 1931
。
如果我使用 CLion GUI 来配置或构建项目或同时执行这两项操作,则它使用 MSVC 19.33.31629.0。 如果我使用 CLion 在配置和构建项目时向我显示的相同命令在 CLion 的终端中配置和构建项目,我可以使用 MSVC 19.31.31107.0。
我错过了什么吗? CLion 是否指定了我应该覆盖的环境变量?是否可以使用 CLion 选择我需要的 MSVC 版本?
这主要不是我的环境的问题,而是 CLion 本身的问题: https://youtrack.jetbrains.com/issue/CPP-30223。
以下解决方法完成了这项工作:创建一个自定义编译器并设置 YAML 配置文件,指定必要的宏、编译器路径、包含目录(包括正确的标准库):
compilers:
- description: MSVC 14.31.31103
match-sources: ".*\\.cpp"
match-language: CPP
match-compiler-exe: ".*/MSVC/14.31.31103/bin/HostX64/x64/cl.exe"
include-dirs:
- ${compiler-exe-dir}/../../../include
- C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
defines:
__cplusplus: 202002L
注:
不同的库可能需要设置更多定义,但您可以从默认的 Visual Studio 工具链中获取它们。