CMake 用于检测 Ninja 的 Visual C++ 编译器工具的环境变量
Environment variable used by CMake to detect Visual C++ compiler tools for Ninja
我有 Mingw64 GCC 6.3.0(总是在 PATH
中)和来自 Visual Studio 2017 RTM(不在 PATH
中)的 Visual C++ 编译器工具。
如果我运行cmake . -G "MinGW Makefiles"
,将选择GCC 6.3.0。
如果我运行cmake . -G "Ninja"
,将选择GCC 6.3.0。
我的Visual C++编译工具是none标准的,我只保留我需要的部分,删除其余部分(如MSBuild,IDE等)。我使用自己的批处理脚本来设置 PATH
、INCLUDE
和 LIB
(效果很好)。
如果我 运行 这个批处理脚本和 运行 cmake .
,将选择 MSVC 并使用 NMake 构建。
在相同的环境下,cmake . -G "Ninja"
,选择了 GCC 6.3.0 而不是 MSVC。
所以我的问题是,当两者都在 PATH
中时,如何告诉 CMake 我想使用 MSVC + Ninja 而不是 GCC + Ninja?我应该设置任何环境变量吗?
使用工具链文件
set(CMAKE_C_COMPILER cl.exe)
set(CMAKE_CXX_COMPILER cl.exe)
然后使用 -DCMAKE_TOOLCHAIN_FILE=toolchainfile
构建您的 cmake 项目
您还可以使用反向方法并使用 CMAKE_IGNORE_PATH
排除所有不需要的编译器。它需要一个要忽略的路径列表,但请注意它需要是一个完全匹配的字符串。优点是您可以直接从命令行声明它们。
所以我所做的是从找到的编译器中获取路径 "not to be taken" 到 CMAKE_IGNORE_PATH
。
在我的系统上 PATH
实际上有三个 GCC 编译器(每次尝试都要确保从一个空的二进制输出目录开始):
> cmake -G"Ninja" ..
...
-- Check for working C compiler: C:/MinGW/bin/cc.exe
...
> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Strawberry/c/bin/gcc.exe
...
> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin;C:/Strawberry/c/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe
...
> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin;C:/Strawberry/c/bin;C:/Program Files (x86)/LLVM/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe
...
我有 Mingw64 GCC 6.3.0(总是在 PATH
中)和来自 Visual Studio 2017 RTM(不在 PATH
中)的 Visual C++ 编译器工具。
如果我运行cmake . -G "MinGW Makefiles"
,将选择GCC 6.3.0。
如果我运行cmake . -G "Ninja"
,将选择GCC 6.3.0。
我的Visual C++编译工具是none标准的,我只保留我需要的部分,删除其余部分(如MSBuild,IDE等)。我使用自己的批处理脚本来设置 PATH
、INCLUDE
和 LIB
(效果很好)。
如果我 运行 这个批处理脚本和 运行 cmake .
,将选择 MSVC 并使用 NMake 构建。
在相同的环境下,cmake . -G "Ninja"
,选择了 GCC 6.3.0 而不是 MSVC。
所以我的问题是,当两者都在 PATH
中时,如何告诉 CMake 我想使用 MSVC + Ninja 而不是 GCC + Ninja?我应该设置任何环境变量吗?
使用工具链文件
set(CMAKE_C_COMPILER cl.exe)
set(CMAKE_CXX_COMPILER cl.exe)
然后使用 -DCMAKE_TOOLCHAIN_FILE=toolchainfile
构建您的 cmake 项目您还可以使用反向方法并使用 CMAKE_IGNORE_PATH
排除所有不需要的编译器。它需要一个要忽略的路径列表,但请注意它需要是一个完全匹配的字符串。优点是您可以直接从命令行声明它们。
所以我所做的是从找到的编译器中获取路径 "not to be taken" 到 CMAKE_IGNORE_PATH
。
在我的系统上 PATH
实际上有三个 GCC 编译器(每次尝试都要确保从一个空的二进制输出目录开始):
> cmake -G"Ninja" ..
...
-- Check for working C compiler: C:/MinGW/bin/cc.exe
...
> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Strawberry/c/bin/gcc.exe
...
> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin;C:/Strawberry/c/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe
...
> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin;C:/Strawberry/c/bin;C:/Program Files (x86)/LLVM/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe
...