我有来自Visual Studio 2017 RTM的Mingw64 GCC 6.3.0(始终在PATH
)和Visual C ++编译器工具(不在PATH
中)。
如果我运行cmake . -G "MinGW Makefiles"
,将选择GCC 6.3.0。
如果我运行cmake . -G "Ninja"
,将选择GCC 6.3.0。
我的Visual C ++编译工具不是标准的,我只保留我需要的部分并删除其余部分(如MSBuild,IDE等)。我使用自己的批处理脚本设置PATH
,INCLUDE
和LIB
(效果很好)。
如果我运行此批处理脚本并运行cmake .
,将选择MSVC并使用NMake进行构建。
在相同的环境cmake . -G "Ninja"
下,选择GCC 6.3.0而不是MSVC。
所以我的问题是,如果告诉CMake我想使用MSVC + Ninja而不是GCC + Ninja,两者都在PATH
?我应该设置的任何环境变量?
答案 0 :(得分:6)
您还可以使用反转方法,并使用CMAKE_IGNORE_PATH
排除所有不需要的编译器。它需要忽略的路径列表,但要注意它必须是精确的字符串匹配。优点是您可以直接从命令行声明它们。
所以我所做的就是从发现的编译器中取出路径,但“不要被带入”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
...
答案 1 :(得分:3)
使用工具链文件
set(CMAKE_C_COMPILER cl.exe)
set(CMAKE_CXX_COMPILER cl.exe)
然后用-DCMAKE_TOOLCHAIN_FILE = toolchainfile构建你的cmake项目