我的操作系统是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.
lam*_*bda 19
这个问题很老,但仍然出现在谷歌搜索上.接受的问题不再适用于我,似乎已经老了.有关cmake的最新信息写在cmake FAQ中.
在那里,您可以找到各种方法来更改编译器的路径.一种方法是
CMAKE_FOO_COMPILER使用在命令行上将适当的变量设置为有效的编译器名称或完整路径cmake -D.例如:Run Code Online (Sandbox Code Playgroud)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你可以写这样的路径/到/你的/编译器
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)
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)
| 归档时间: |
|
| 查看次数: |
142671 次 |
| 最近记录: |