如何在cmake中自动找到编译器路径?

时间:2019-05-21 02:04:49

标签: cmake

我想在cmake中自动设置编译器路径(例如:icc),因此,只要安装了icc,我的程序就可以在任何计算机上进行编译,我们不需要关心icc的安装位置。

首先,我使用跟随命令来设置编译器。一切都很好。

set(Intel_C_COMPILER "/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc")
set(Intel_CXX_COMPILER "/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc")

set(CMAKE_C_COMPILER   ${Intel_C_COMPILER}  )
set(CMAKE_CXX_COMPILER ${Intel_CXX_COMPILER})

project(MyProject)

....

然后,我想自动设置编译器路径,我知道遵循命令可以找到编译器路径

which icc

因此,我编写了以下命令,尝试通过cmake自动设置编译器。

execute_process(COMMAND which icc  OUTPUT_VARIABLE Intel_C_COMPILER)
execute_process(COMMAND which icpc OUTPUT_VARIABLE Intel_CXX_COMPILER)

message(Intel_CXX_COMPILER: ${Intel_C_COMPILER})
message(Intel_CXX_COMPILER: ${Intel_CXX_COMPILER})

set(CMAKE_C_COMPILER   ${Intel_C_COMPILER}  )
set(CMAKE_CXX_COMPILER ${Intel_CXX_COMPILER})

project(MyProject)

....

在这种情况下,发生了一些奇怪的事情,cmake显示:


 Intel_CXX_COMPILER:/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc

-- The C compiler identification is unknown
-- The CXX compiler identification is unknown

 CMake Error at CMakeLists.txt:27 (project):   The CMAKE_C_COMPILER:

    /opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc



  is not a full path to an existing compiler tool.

  Tell CMake where to find the compiler by setting either the
environment   variable "CC" or the CMake cache entry CMAKE_C_COMPILER
to the full path to   the compiler, or to the compiler name if it is
in the PATH.


CMake Error at CMakeLists.txt:27 (project):   The CMAKE_CXX_COMPILER:

    /opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc



  is not a full path to an existing compiler tool.

  Tell CMake where to find the compiler by setting either the
environment   variable "CXX" or the CMake cache entry
CMAKE_CXX_COMPILER to the full path   to the compiler, or to the
compiler name if it is in the PATH.


 -- Configuring incomplete, errors occurred!

CMake表示该路径不是现有编译器的完整路径,但如message所示,它只是编译器所在的位置!

我知道我们可以设置编译器的其他技术,例如导出一些环境变量以帮助cmake找到路径,但是我想知道为什么我的方法不起作用?

有没有更好的方法可以解决这个问题?

先谢谢了。

2 个答案:

答案 0 :(得分:1)

通常来说,无法在项目中设置变量CMAKE_C_COMPILERCMAKE_CXX_COMPILER

由于编译器检测是通过project()调用进行的,因此必须在配置项目时及早设置编译器。

我建议您尝试以下操作:

export CC=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc
export CXX=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc

cd /path/to/build
cmake /path/to/src

或者您也可以传递变量CMAKE_C_COMPILERCMAKE_CXX_COMPILER

export CC=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc
export CXX=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc

cd /path/to/build
cmake \
  -DCMAKE_C_COMPILER:FILEPATH=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc \
  -DCMAKE_CXX_COMPILER:FILEPATH=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc \
  /path/to/src

重要:尝试这些命令时,请确保在空的构建目录中配置项目。

答案 1 :(得分:1)

变量Intel_C_COMPILERIntel_CXX_COMPILER具有尾随换行符。该问题及其答案中介绍了删除该换行符的方法:How to strip trailing whitespace in CMake variable?

例如,您可以使用 OUTPUT_STRIP_TRAILING_WHITESPACE 选项运行execute_process,因此其行为类似于Shell的反引号运算符(“ icc”)。

详细说明

大多数Shell实用程序输出带有尾随换行符的单行(甚至多行)信息。实用程序which也不例外。使用结尾的换行符,当在终端中运行这些实用程序时,输出看起来不错。

但是当在脚本中运行这样的实用程序并以编程方式获取其输出时,就需要关心这样的换行符。