使用 cmake 更改编译器会创建无限循环

Changing compiler with cmake creates infinite loop

我尝试用 cmake 更改编译器:

SET(CMAKE_C_COMPILER   "/opt/rh/devtoolset-2/root/usr/bin/gcc")
SET(CMAKE_CXX_COMPILER "/opt/rh/devtoolset-2/root/usr/bin/g++")

我在项目开始时调用 "PROJECT" 命令之前执行此操作。 但是当我调用 cmake 时出现无限循环,我有以下输出:

-- The C compiler identification is GNU 4.8.2
-- The CXX compiler identification is GNU 4.8.2
-- Check for working C compiler: /opt/rh/devtoolset-2/root/usr/bin/gcc
-- Check for working C compiler: /opt/rh/devtoolset-2/root/usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /opt/rh/devtoolset-2/root/usr/bin/g++
-- Check for working CXX compiler: /opt/rh/devtoolset-2/root/usr/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Doxygen: /usr/bin/doxygen (found version "1.6.1") 
-- Looking for C++ include tut.h
-- Looking for C++ include tut.h - found
-- [STATUS] Found tut.h
-- Configuring done
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_CXX_COMPILER= /usr/bin/c++
CMAKE_CXX_COMPILER= /usr/bin/c++

所以我在无限循环中一次又一次地收到此消息,即使我在调用 cmake 之前删除了缓存...

编辑: 解决方法很简单:你需要使用 cmake 版本 2.8.9,问题没有出现。

解决方法很简单:你需要使用cmake 2.8.9版本,问题没有出现。

因为这是我在 Google 上的第一个结果,我想我会提供一个替代 Quentin 的解决方案。

如果您使用 -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake 调用您的 cmake 命令,您可以将 CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER 覆盖放在一个新的 toolchain.cmake 文件中并且 cmake 将在没有无限循环的情况下正确加载覆盖。

此解决方案为那些无法轻松升级其 cmake 的用户(例如,如果您是非 root 用户和非 sudo 用户)、那些只想避免升级包或管理额外的工作的用户提供了修复包,或者那些不想打扰他们的系统管理员的人。此外,toolchain.cmake 文件仍然可以执行逻辑来查找合适的或最新的 devtoolset,如果您希望它动态选择的话。

此解决方案不适用于那些不会或不能将 -DCMAKE_TOOLCHAIN_FILE 参数添加到 cmake 调用的人。

可能是其他cmake模块修改了你设置的变量。所以找到cmake的代码,把它放在你的command(SET(CMAKE_CXX_COMPILER "/opt/rh/devtoolset-2/root/usr/bin/g++"))之前,应该就可以解决了

我遇到 pybind11 子模块的问题如下

SET(CMAKE_C_COMPILER /usr/bin/gcc)
SET(CMAKE_CXX_COMPILER /usr/bin/g++)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")

add_subdirectory(pybind11)

解决方案是将其更改为:

add_subdirectory(pybind11)

SET(CMAKE_C_COMPILER /usr/bin/gcc)
SET(CMAKE_CXX_COMPILER /usr/bin/g++)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")

在 cmake3.15 上,我发现一旦删除 CMakeCache 文件并重新执行 cmake,一切都很好