C++ 如何允许用户重新配置编译器以与cmake一起使用?

C++ 如何允许用户重新配置编译器以与cmake一起使用?,c++,gcc,cmake,mpi,cmake-gui,C++,Gcc,Cmake,Mpi,Cmake Gui,我希望允许用户运行cmake配置工具(如ccmake或cmake gui)来更改使用的编译器。这是必要的,因为我正在构建一个跨平台程序,该程序有时在集群上运行(因此需要具有适当MPI构造的集群特定编译器),但有时在非MPI模式下运行 让我们假设编译器通常可以是平台期望的任何东西(通常是gcc/g++或在最坏的情况下是MSVC),但是当我们使用MPI时,我们总是知道我们需要通过mpicc/mpicxx进行编译 我觉得以下代码应该可以工作: cmake_minimum_required(VERSIO

我希望允许用户运行cmake配置工具(如ccmake或cmake gui)来更改使用的编译器。这是必要的,因为我正在构建一个跨平台程序,该程序有时在集群上运行(因此需要具有适当MPI构造的集群特定编译器),但有时在非MPI模式下运行

让我们假设编译器通常可以是平台期望的任何东西(通常是gcc/g++或在最坏的情况下是MSVC),但是当我们使用MPI时,我们总是知道我们需要通过mpicc/mpicxx进行编译

我觉得以下代码应该可以工作:

cmake_minimum_required(VERSION 2.4)

option(USE_MPI "Is this on an MPI system?" OFF)

if (USE_MPI)
   message(STATUS "Setting compiler to MPIC")
   set(CMAKE_CXX_COMPILER mpicxx)
   set(CMAKE_C_COMPILER mpicc)
endif(USE_MPI)

project(test_project)

add_executable(testprogram test.cpp)
上面是一个简化的例子,但我相信它说明了我正在尝试做什么

这假设mpicxx和mpicc在路径上,但这并不是真正的问题。出现此问题的原因是,当您运行ccmake或cmake gui时,它会计算并逐步删除默认选项路径“off”,然后点击项目行,并将适用于标准本机编译器(通常是gcc)的路径和选项写入缓存。您可以更改gui中的选项,但为时已晚,再次配置/生成不会更新缓存。即使用户确实打开了该选项,编译器仍保持设置状态

我似乎想做的是重新运行project()行上的编译器查找例程


有更好的方法吗?我是否误解了应该如何设置编译器?

最好的方法是使用几个不同配置的源代码外构建目录,这也是CMake鼓励的方法

众所周知,在创建cmake缓存后很难甚至不可能更改编译器,因此,在首次使用命令行调用cmake时直接设置选项更明智:

mkdir mpi-build && cd mpi-build && cmake -DUSE_MPI=ON ..
您可以使用设置所需的编译器:

# gcc.cmake
message("We will use GCC compiler")
set(CMAKE_C_COMPILER gcc CACHE STRING "C compiler" FORCE)
set(CMAKE_CXX_COMPILER g++ CACHE STRING "C++ compiler" FORCE)

# clang.cmake
message("We will use Clang compiler")
set(CMAKE_C_COMPILER clang CACHE STRING "C compiler" FORCE)
set(CMAKE_CXX_COMPILER clang++ CACHE STRING "C++ compiler" FORCE)
用法 例子
我只是将其添加到“CMakeLists.txt”中,它就可以工作了

    option(USE_MPI "Build with MPI" ON)

    if(USE_MPI)
        message("We will use mpi compiler")
        set(CMAKE_C_COMPILER mpicc CACHE STRING "mpicc compiler" FORCE)
        set(CMAKE_CXX_COMPILER mpic++ CACHE STRING "mpiC++ compiler" FORCE)
    endif()

这个解决方案感觉像是我需要的,但我在实现它时遇到了问题。首先,当我尝试切换工具链时,我得到:
CMake警告:项目未使用手动指定的变量:CMake_工具链_文件
我的mpicxx编译器也有问题(但它可以找到mpicc编译器)。当我重写CMakeLists.txt以便mpicxx和mpicc是构建的唯一编译器时,它在这个上下文中查找它们不会有问题,但是当它试图在工具链文件的上下文中查找它们时,它放弃了,只是恢复到g++。
首先,当我尝试切换工具链时,
您的意思是在一个构建目录中使用一个工具链运行cmake,然后将另一个工具链设置到同一目录吗?您需要使用另一个构建目录,这是一个通用的cmake规则:如果更改cmake选项,则需要删除旧的构建目录(确切地说,是缓存)。
    option(USE_MPI "Build with MPI" ON)

    if(USE_MPI)
        message("We will use mpi compiler")
        set(CMAKE_C_COMPILER mpicc CACHE STRING "mpicc compiler" FORCE)
        set(CMAKE_CXX_COMPILER mpic++ CACHE STRING "mpiC++ compiler" FORCE)
    endif()