我的操作系统是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
,但它不起作用。
答案 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对编译器执行检查:它是否有效?它能够生成可执行文件吗?它还使用编译器来检测相关工具,例如ar
和ranlib
。当您在脚本中覆盖编译器值时,它“太晚了”,所有检查和检测都已完成。
例如,在我的机器上使用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
设置为新路径。
答案 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
,还适用于./configure
和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
答案 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 ...