如何为CMake指定新的GCC路径

tid*_*idy 101 gcc cmake

我的操作系统是centos,它在路径中有一个默认的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,但它不能正常工作.

Gui*_*ume 185

不要覆盖CMAKE_C_COMPILER,而是在调用cmake之前导出CC(和CXX):

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
Run Code Online (Sandbox Code Playgroud)

导出只需要完成一次,第一次配置项目时,将从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++)
Run Code Online (Sandbox Code Playgroud)

执行此操作时,您将创建一个"正常"变量CMAKE_C(XX)_COMPILER,该变量隐藏同名的缓存变量.这意味着您的编译器现在已在构建脚本中进行了硬编码,并且您无法为其提供自定义值.如果您有多个具有不同编译器的构建环境,这将是一个问题.您可以在每次要使用其他编译器时更新脚本,但这样就消除了首先使用CMake的价值.

好吧,那么,让我们更新缓存......

随着缓存

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
Run Code Online (Sandbox Code Playgroud)

这个版本只是"不起作用".该CMAKE_C(XX)_COMPILER变量已经在缓存中,因此除非您强制它,否则它不会更新.

啊......让我们用力,然后......

强制缓存

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
Run Code Online (Sandbox Code Playgroud)

这几乎与"普通"变量版本相同,唯一的区别是您的值将在缓存中设置,因此用户可以看到它.但任何更改都将被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.

  • 相当于懒惰,如果你的$ PATH中设置了正确的编译器:`export CC = \`哪个gcc \`export CXX = \`哪个g ++ \`` (11认同)
  • 实际上,只要你使用命令行设置`CMAKE_C_COMPILER`就可以正常工作:`$ cmake -GNinja -DCMAKE_C_COMPILER = clang -DCMAKE_CXX_COMPILER = clang ++/path/to/source`. (4认同)

lam*_*bda 19

这个问题很老,但仍然出现在谷歌搜索上.接受的问题不再适用于我,似乎已经老了.有关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
Run Code Online (Sandbox Code Playgroud)

而不是gcc-4.2你可以写这样的路径/到/你的/编译器

 cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .
Run Code Online (Sandbox Code Playgroud)

  • 我是在旧编译器(GCC 5.3)上构建旧项目时这样做的,而新编译器(GCC 7.3)是在环境中获取的。它构建得很好并且在我的机器上工作,但是当我将可执行文件移动到另一台机器时,我意识到该程序从源 7.3 链接到 libstdc++.so 而不是请求的 5.3... (2认同)

Joh*_*nck 7

设置CMAKE_C_COMPILER为您的新路径.

见这里:http://www.cmake.org/Wiki/CMake_Useful_Variables


Cam*_*mer 5

更改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 )
Run Code Online (Sandbox Code Playgroud)

使用工具链文件

更明智的选择是创建工具链文件。

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++" )
Run Code Online (Sandbox Code Playgroud)

然后使用附加标志调用 Cmake

cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...
Run Code Online (Sandbox Code Playgroud)