152

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

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

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

4

7 回答 7

265

在调用 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 缓存中读取这些值。


更新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命令 to时/usr/bin/clangar设置为/usr/bin/gcc-ar-7. 在运行 CMake 之前使用导出时,它设置为/usr/lib/llvm-3.8/bin/llvm-ar.

于 2013-06-24T12:36:24.157 回答
41

这个问题已经很老了,但仍然出现在 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++ .
于 2018-05-23T17:21:28.927 回答
7

设置CMAKE_C_COMPILER为您的新路径。

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

于 2013-06-24T12:32:36.377 回答
4

导出应该具体说明使用哪个版本的 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,这可以通过-std=C++-11在 CMakeList.txt 中使用标志来处理

于 2014-12-20T05:19:54.527 回答
3

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

于 2016-09-05T12:13:12.387 回答
2

这不仅适用于cmake,而且适用于./configureand make

./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
于 2019-11-12T00:43:10.440 回答
1

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 ...
于 2020-05-28T08:47:40.903 回答