我的操作系统是 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
但它不起作用。
在调用 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 会对编译器进行检查:它工作吗?它能够生成可执行文件吗?等。它还使用编译器来检测相关工具,如ar
和ranlib
。当您在脚本中覆盖编译器值时,“为时已晚”,所有检查和检测都已完成。
例如,在我使用 gcc 作为默认编译器的机器上,当使用set
命令 to时/usr/bin/clang
,ar
设置为/usr/bin/gcc-ar-7
. 在运行 CMake 之前使用导出时,它设置为/usr/lib/llvm-3.8/bin/llvm-ar
.
这个问题已经很老了,但仍然出现在 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++ .
设置CMAKE_C_COMPILER
为您的新路径。
导出应该具体说明使用哪个版本的 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 中使用标志来处理
另一种解决方案是通过 cmake-gui 配置您的项目,从一个干净的构建目录开始。在您一开始可用的选项中,可以选择编译器的确切路径
这不仅适用于cmake
,而且适用于./configure
and 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
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 ...