我的操作系统是 centos,它在路径 /usr/bin/gcc中有一个默认的 gcc。但它是旧的,我需要一个新版本的 gcc。所以我在新路径 /usr/local/bin/gcc中安装了一个新版本。
/usr/bin/gcc
/usr/local/bin/gcc
但是当我运行 cmake时,它仍然使用旧版本的 gcc 路径(/usr/bin/gcc)。如何将 gcc 指定为 new path (/usr/local/bin/gcc)。
cmake
我曾试图用 /usr/local/bin/gcc覆盖 /usr/bin/gcc,但是没有用。
将 CMAKE_C_COMPILER设置为新路径。
CMAKE_C_COMPILER
看这里: http://www.cmake.org/Wiki/CMake_Useful_Variables
不要覆盖 CMAKE_C_COMPILER,但在调用 cmake 之前导出 CC(和 CXX) :
CC
CXX
export CC=/usr/local/bin/gcc export CXX=/usr/local/bin/g++ cmake /path/to/your/project make
只需要在第一次配置项目时导出一次,然后就可以从 CMake 缓存中读取这些值。
更新 : 在 Jake 的评论之后,关于为什么不重写 CMAKE_C(XX)_COMPILER的更长的解释
CMAKE_C(XX)_COMPILER
我建议不要重写 CMAKE_C(XX)_COMPILER值,主要有两个原因: 因为它不能很好地使用 CMake 的缓存,以及因为它破坏了编译器检查和工具检测。
在使用 set命令时,您有三个选项:
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。当您在脚本中覆盖编译器值时,“太晚了”,所有的检查和检测都已经完成。
ar
ranlib
例如,在使用 gcc 作为默认编译器的机器上,当使用 set命令设置为 /usr/bin/clang时,ar被设置为 /usr/bin/gcc-ar-7。在运行 CMake 之前使用导出时,它被设置为 /usr/lib/llvm-3.8/bin/llvm-ar。
/usr/bin/clang
/usr/bin/gcc-ar-7
/usr/lib/llvm-3.8/bin/llvm-ar
导出应该具体说明要使用哪个版本的 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标志来处理
-std=C++-11
另一种解决方案是从一个干净的构建目录开始,通过 cmake-gui 配置项目。在开始时可用的选项中,有可能选择到编译器的确切路径
这个问题很老了,但是仍然出现在谷歌搜索上。这个被接受的问题对我不再有用,而且似乎已经老了。关于 cmake 的最新信息写在 常见问题解答中。
有多种方法可以更改编译器的路径
将适当的 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
将适当的 CMAKE_FOO_COMPILER变量设置为有效的编译器 使用 cmake -D命令行上的名称或完整路径。例如:
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
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,也适用于 ./configure和 make:
./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
CMAKE_<LANG>_COMPILER
我想用一个替代的编译器进行编译,但是也可以在命令行上设置传递 D 选项,如果设置不同的编译器,这些选项就会被消除。这是因为它触发了一个重新配置。诀窍是使用 NONE禁用编译器检测,使用 FORCE设置路径,然后使用 enable_language设置路径。
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 ...