如何为CMake指定新的GCC路径


122

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

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

我试图覆盖/usr/bin/gcc/usr/local/bin/gcc,但它不能正常工作。


2
我认为将替代gcc版本安装到/opt而不是中是一个好习惯/usr/local。最好/opt/gcc-x.y.z。这样,如果您需要更新的版本,则卸载前一个版本将没有任何麻烦。
user666412

Answers:


219

不要覆盖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命令to时/usr/bin/clangar设置为/usr/bin/gcc-ar-7。在运行CMake之前使用导出时,将其设置为/usr/lib/llvm-3.8/bin/llvm-ar


如果您在$ PATH中设置了正确的编译器,则等效于惰性的:> export CC = which gcc > export CXX =which g++
gerardw 2014年

11
如果您的$ PATH中设置了正确的编译器,则等效于懒惰: export CC=`which gcc` export CXX=`which g++`
gerardw 2014年

如果CC / CXX与路线不同,我会得到Incorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
莉莉丝河

1
如果我在Windows上怎么办?
mr5

5
实际上,CMAKE_C_COMPILER如果您使用以下命令行进行设置,则设置效果很好$ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source
Erwan Legrand

25

这个问题已经很老了,但仍然出现在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
我这样做的时候,是在旧的编译器(GCC 5.3)上构建旧项目,而环境中却有更新的编译器(GCC 7.3)。它建立了良好的和我的机器上工作,但一旦我感动的可执行文件到不同的机器,我实现了程序链接到的libstdc ++所以从采购7.3,而不是5.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,则可以通过使用-std=C++-11CMakeList.txt中的标志来处理


2

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


2

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

0

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

我想使用备用编译器进行编译,但也希望在命令行中传递-D选项,而通过设置其他编译器会使其消失。发生这种情况是因为它触发了重新配置。诀窍是使用禁用编译器检测,然后使用NONE设置路径。FORCEenable_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 ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.