如何为CMake指定新的GCC路径

时间:2013-06-24 12:21:06

标签: gcc cmake

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

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

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

7 个答案:

答案 0 :(得分:171)

不要覆盖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缓存中读取。


更新:关于为什么在杰克的评论之后没有覆盖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

答案 1 :(得分:15)

此问题相当陈旧,但仍会出现在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

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

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

答案 2 :(得分:6)

CMAKE_C_COMPILER设置为新路径。

见这里:http://www.cmake.org/Wiki/CMake_Useful_Variables

答案 3 :(得分: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 :(得分:2)

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

答案 5 :(得分:0)

这不仅适用于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

答案 6 :(得分:0)

更改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 ...