【问题标题】:How to specify new GCC path for CMake如何为 CMake 指定新的 GCC 路径
【发布时间】:2013-06-20 22:51:23
【问题描述】:

我的操作系统是 centos,它在路径 /usr/bin/gcc 中有一个默认的 gcc。但它很旧,我需要一个新版本的 gcc。所以我在新路径/usr/local/bin/gcc安装了新版本。

但是当我运行cmake时,它仍然使用旧版本的gcc路径(/usr/bin/gcc)。如何将 gcc 指定到新路径(/usr/local/bin/gcc)。

我尝试用/usr/local/bin/gcc 覆盖/usr/bin/gcc,但它不起作用。

【问题讨论】:

  • 我认为将备用 gcc 版本安装到 /opt 而不是 /usr/local 是一个好习惯。最好是/opt/gcc-x.y.z。这样一来,如果您需要更新的版本,卸载之前的版本不会有任何问题。

标签: gcc cmake


【解决方案1】:

CMAKE_C_COMPILER 设置为您的新路径。

请看这里:http://www.cmake.org/Wiki/CMake_Useful_Variables

【讨论】:

    【解决方案2】:

    在调用 cmake 之前不要覆盖CMAKE_C_COMPILER,而是导出CC(和CXX):

    export CC=/usr/local/bin/gcc
    export CXX=/usr/local/bin/g++
    cmake /path/to/your/project
    make
    

    只需要导出一次,在你第一次配置项目时,那些值将从 CMake 缓存中读取。


    更新:关于在 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 的价值。

    好的,那么,让我们更新缓存...

    带缓存

    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

    【讨论】:

    • 如果在 $PATH 中设置了正确的编译器,则相当于懒惰: > export CC=which gcc > export CXX=which g++
    • 如果在 $PATH 中设置了正确的编译器,则相当于懒惰:export CC=`which gcc` export CXX=`which g++`
    • 如果 CC/CXX 与路径不同,我会得到 Incorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
    • 如果我使用的是 Windows,我该怎么做?
    • 实际上,设置CMAKE_C_COMPILER 效果很好,只要您使用命令行:$ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source
    【解决方案3】:

    导出时要具体说明使用哪个版本的GCC/G++,因为如果用户有多个编译器版本,将无法编译成功。

     export CC=path_of_gcc/gcc-version
     export CXX=path_of_g++/g++-version
     cmake  path_of_project_contain_CMakeList.txt
     make 
    

    如果项目使用 C++11,这可以通过在 CMakeList.txt 中使用 -std=C++-11 标志来处理

    【讨论】:

      【解决方案4】:

      另一种解决方案是通过 cmake-gui 配置您的项目,从一个干净的构建目录开始。在您一开始可用的选项中,可以选择编译器的确切路径

      【讨论】:

        【解决方案5】:

        这个问题已经很老了,但仍然出现在 Google 搜索中。接受的问题不再对我有用,而且似乎已经老化。关于cmake的最新资料写在cmake FAQ

        有多种方法可以更改编译器的路径。一种方法是

        将适当的CMAKE_FOO_COMPILER 变量设置为有效的编译器 使用cmake -D 在命令行上的名称或完整路径。例如:

        cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source
        

        你可以像这样写path/to/your/compiler而不是gcc-4.2

         cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .
        

        【讨论】:

        • 我是在旧编译器 (GCC 5.3) 上构建旧项目时这样做的,而新编译器 (GCC 7.3) 是在环境中获取的。它构建得很好并且可以在我的机器上运行,但是一旦我将可执行文件移动到另一台机器上,我意识到该程序从源代码 7.3 而不是请求的 5.3 链接到 libstdc++.so...
        • 这对我有用,而接受的却没有。
        【解决方案6】:

        这不仅适用于cmake,还适用于./configuremake

        ./configure CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++
        

        这会导致:

        checking for gcc... /usr/local/bin/gcc
        checking whether the C compiler works... yes
        

        【讨论】:

          【解决方案7】:

          更改CMAKE_<LANG>_COMPILER 路径而不触发重新配置

          我想用一个备用编译器进行编译,但也在命令行上传递 -D 选项,这些选项会通过设置不同的编译器而被清除。发生这种情况是因为它触发了重新配置。诀窍是使用NONE 禁用编译器检测,使用FORCE 设置路径,然后使用enable_language

          project( sample_project NONE )
          
          set( COMPILER_BIN /opt/compiler/bin )
          set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" FORCE )
          set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" FORCE )
          
          enable_language( C CXX )
          

          使用工具链文件

          更明智的选择是创建一个工具链文件。

          set( CMAKE_SYSTEM_NAME Darwin )
          
          set( COMPILER_BIN /opt/compiler/bin )
          set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" )
          set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" )
          

          然后你用一个额外的标志调用 Cmake

          cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...
          

          【讨论】:

            猜你喜欢
            • 2018-09-23
            • 2022-07-22
            • 1970-01-01
            • 1970-01-01
            • 2015-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-20
            相关资源
            最近更新 更多