如何为 CMake 指定新的 GCC 路径

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

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

我曾试图用 /usr/local/bin/gcc覆盖 /usr/bin/gcc,但是没有用。

277730 次浏览

CMAKE_C_COMPILER设置为新路径。

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

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


更新 : 在 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

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

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

这个问题很老了,但是仍然出现在谷歌搜索上。这个被接受的问题对我不再有用,而且似乎已经老了。关于 cmake 的最新信息写在 常见问题解答中。

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

将适当的 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++ .

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

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