如何为cmake指定新的gccpath

我的操作系统是在path/usr/bin/gcc具有默认gcc的centos。 但是它已经老了,我需要一个新版本的gcc。 所以我在新path/usr/local/bin/gcc安装一个新版本。

但是当我运行cmake ,它仍然使用旧版本的gccpath( /usr/bin/gcc )。 我如何指定gcc到新path( /usr/local/bin/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 

导出只需要一次,第一次configuration项目,那么这些值将被从cmakecaching中读取。


更新 :更长的解释,为什么不重写杰克评论后CMAKE_C(XX)_COMPILER

我build议不要重写CMAKE_C(XX)_COMPILER值,主要有两个原因:因为CMake的caching不能很好地发挥,因为它打破了编译器检查和工具检测。

使用set命令时,有三种select:无caching,创build一个带caching的普通variables,创buildcachingvariables,强制caching,configuration时总是强制caching值。

让我们看看为了set三个可能的调用会发生什么:

没有caching

 set(CMAKE_C_COMPILER /usr/bin/clang) set(CMAKE_CXX_COMPILER /usr/bin/clang++) 

当这样做,你创build一个“正常”variablesCMAKE_C(XX)_COMPILER隐藏相同名称的cachingvariables。 这意味着你的编译器现在在编译脚本中是硬编码的,你不能给它一个自定义的值。 如果你有不同编译器的多个构build环境,这将是一个问题。 每次你想使用不同的编译器时,你都可以更新你的脚本,但是这首先消除了使用CMake的价值。

好的,我们来更新caching

随着caching

 set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "") set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "") 

这个版本只是“不行”。 CMAKE_C(XX)_COMPILERvariables已经在caching中,所以它不会被更新,除非你强制它。

啊…让我们使用武力,然后…

强制caching

 set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE) set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE) 

这与“正常”variables版本几乎相同,唯一不同的是你的值将被设置在caching中,所以用户可以看到它。 但是任何更改都将被set命令覆盖。

打破编译器检查和工具

在configuration过程早期,CMake会对编译器进行检查:是否有效? 它能够生成可执行文件吗? 它也使用编译器来检测相关工具,如arranlib 。 当您在脚本中覆盖编译器值时,“太晚”,所有检查和检测都已经完成。

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

CMAKE_C_COMPILER设置为您的新path。

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

导出应具体指明要使用哪个版本的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标志来处理

另一种解决scheme是通过cmake-guiconfiguration你的项目,从一个干净的构build目录开始。 在开始的可用选项中,可以select编译器的确切path