我想在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找到路径,但是我想知道为什么我的方法不起作用?
有没有更好的方法可以解决这个问题?
先谢谢了。
答案 0 :(得分:1)
通常来说,无法在项目中设置变量CMAKE_C_COMPILER
和CMAKE_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_COMPILER
和CMAKE_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_COMPILER
和Intel_CXX_COMPILER
具有尾随换行符。该问题及其答案中介绍了删除该换行符的方法:How to strip trailing whitespace in CMake variable?
例如,您可以使用 OUTPUT_STRIP_TRAILING_WHITESPACE 选项运行execute_process
,因此其行为类似于Shell的反引号运算符(“ icc”)。
大多数Shell实用程序输出带有尾随换行符的单行(甚至多行)信息。实用程序which
也不例外。使用结尾的换行符,当在终端中运行这些实用程序时,输出看起来不错。
但是当在脚本中运行这样的实用程序并以编程方式获取其输出时,就需要关心这样的换行符。