如何为cmake指定新的gccpath
我的操作系统是在path/usr/bin/gcc
具有默认gcc的centos。 但是它已经老了,我需要一个新版本的gcc。 所以我在新path/usr/local/bin/gcc
安装一个新版本。
但是当我运行cmake
,它仍然使用旧版本的gccpath( /usr/bin/gcc
)。 我如何指定gcc到新path( /usr/local/bin/gcc
)。
我试图用/usr/local/bin/gcc
覆盖/usr/bin/gcc
/usr/local/bin/gcc
,但是不行。
不要覆盖CMAKE_C_COMPILER
,而是在调用cmake之前导出CC(和CXX):
export CC=/usr/local/bin/gcc export CXX=/usr/local/bin/g++ cmake /path/to/your/project make
导出只需要一次,第一次configuration项目,那么这些值将被从cmakecaching中读取。
更新 :更长的解释,为什么不重写杰克评论后CMAKE_C(XX)_COMPILER
我build议不要重写CMAKE_C(XX)_COMPILER
值,主要有两个原因:因为CMake的caching不能很好地发挥,因为它打破了编译器检查和工具检测。
使用set
命令时,有三种select:无caching,创build一个带caching的普通variables,创buildcachingvariables,强制caching,configuration时总是强制caching值。
让我们看看为了set
三个可能的调用会发生什么:
没有caching
set(CMAKE_C_COMPILER /usr/bin/clang) set(CMAKE_CXX_COMPILER /usr/bin/clang++)
当这样做,你创build一个“正常”variablesCMAKE_C(XX)_COMPILER
隐藏相同名称的cachingvariables。 这意味着你的编译器现在在编译脚本中是硬编码的,你不能给它一个自定义的值。 如果你有不同编译器的多个构build环境,这将是一个问题。 每次你想使用不同的编译器时,你都可以更新你的脚本,但是这首先消除了使用CMake的价值。
好的,我们来更新caching
随着caching
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "") set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
这个版本只是“不行”。 CMAKE_C(XX)_COMPILER
variables已经在caching中,所以它不会被更新,除非你强制它。
啊…让我们使用武力,然后…
强制caching
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE) set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
这与“正常”variables版本几乎相同,唯一不同的是你的值将被设置在caching中,所以用户可以看到它。 但是任何更改都将被set
命令覆盖。
打破编译器检查和工具
在configuration过程早期,CMake会对编译器进行检查:是否有效? 它能够生成可执行文件吗? 它也使用编译器来检测相关工具,如ar
和ranlib
。 当您在脚本中覆盖编译器值时,“太晚”,所有检查和检测都已经完成。
例如,在我的机器上用gcc作为默认编译器,当使用set
命令到/usr/bin/clang
, ar
被设置为/usr/bin/gcc-ar-7
。 在运行CMake之前使用导出时,它被设置为/usr/lib/llvm-3.8/bin/llvm-ar
。
将CMAKE_C_COMPILER
设置为您的新path。
看到这里: http : //www.cmake.org/Wiki/CMake_Useful_Variables
导出应具体指明要使用哪个版本的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
标志来处理
另一种解决scheme是通过cmake-guiconfiguration你的项目,从一个干净的构build目录开始。 在开始的可用选项中,可以select编译器的确切path