我的操作系统是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会对编译器进行检查:是否起作用?它能够产生可执行文件吗?等等。它还使用编译器来检测相关工具,例如arranlib。当您在脚本中覆盖编译器值时,它“太迟了”,所有检查和检测都已完成。

    例如,在我的机器上使用gcc作为默认编译器,将set命令用于/usr/bin/clang时,ar设置为/usr/bin/gcc-ar-7。在运行CMake之前使用导出时,将其设置为/usr/lib/llvm-3.8/bin/llvm-ar

    07-24 09:45
    查看更多