我的操作系统是centos,在路径/usr/bin/gcc
中具有默认的gcc。但是它很旧,我需要新版本的gcc。因此,我在新路径/usr/local/bin/gcc
中安装了新版本。
但是当我运行cmake
时,它仍然使用旧版本的gcc path(/usr/bin/gcc
)。我如何指定gcc到新路径(/usr/local/bin/gcc
)。
我试图用/usr/bin/gcc
覆盖/usr/local/bin/gcc
,但是不起作用。
最佳答案
不要覆盖CMAKE_C_COMPILER
,而是在调用cmake之前导出CC
(和CXX
):
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
首次配置项目时,只需执行一次导出,然后将从CMake缓存中读取这些值。
UPDATE :关于为什么在Jake发表评论后不覆盖
CMAKE_C(XX)_COMPILER
的更长解释我建议不要重写
CMAKE_C(XX)_COMPILER
值,主要有两个原因:因为它不能与CMake的缓存配合使用,并且因为它破坏了编译器检查和工具检测。使用
set
命令时,有三个选项:让我们看看对
set
的三个可能的调用会发生什么:不带缓存
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
在执行此操作时,您将创建一个“普通”变量
CMAKE_C(XX)_COMPILER
来隐藏相同名称的缓存变量。这意味着您的编译器现在已经在您的构建脚本中进行了硬编码,并且您无法为其赋予自定义值。如果您具有使用不同编译器的多个构建环境,这将是一个问题。您可以在每次要使用其他编译器时更新脚本,但这首先消除了使用CMake的值(value)。好的,那么,让我们更新缓存...
使用缓存
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
此版本将“不起作用”。
CMAKE_C(XX)_COMPILER
变量已经在缓存中,因此除非您强制执行,否则它不会被更新。啊...那就用力吧...
强制缓存
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
这几乎与“普通”变量版本相同,唯一的区别是您的值将在缓存中设置,因此用户可以看到它。但是,任何更改都将被
set
命令覆盖。破坏编译器检查和工具
在配置过程的早期,CMake会对编译器进行检查:是否起作用?它能够产生可执行文件吗?等等。它还使用编译器来检测相关工具,例如
ar
和ranlib
。当您在脚本中覆盖编译器值时,它“太迟了”,所有检查和检测都已完成。例如,在我的机器上使用gcc作为默认编译器,将
set
命令用于/usr/bin/clang
时,ar
设置为/usr/bin/gcc-ar-7
。在运行CMake之前使用导出时,将其设置为/usr/lib/llvm-3.8/bin/llvm-ar
。