我想将英特尔编译器icc(或icpc)与基于CMake的项目一起使用(在Linux上用于它的价值)。我当然可以在调用cmake时输出CXX变量,例如像
CXX=icpc cmake ../
这很好用。但是,我想通过自定义选项提供此选择。为此我解析自定义选项,例如
cmake -DMY_COMPILER_OPTION=Intel ..
作为
IF (MY_COMPILER_OPTION STREQUAL "Intel")
MESSAGE(STATUS "** Compiling with Intel settings **")
SET(CMAKE_CXX_COMPILER "icpc")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -w")
SET(CMAKE_CXX_FLAGS_DEBUG "-g")
ENDIF ()
并将CMAKE_CXX_COMPILER
与一些编译器标志一起设置。这也有效,但有一个重要的“但是”。
我还想在使用icc编译时使用选项-ipo
(过程间优化)代码我需要在构建过程中编译静态库。要实现这一点,我需要使用英特尔的xiar
(我猜也是xilink
)。
cmake实际上为此
提供了一个特殊属性set_property(TARGET mytarget PROPERTY INTERPROCEDURAL_OPTIMIZATION 1)
然而,当通过环境变量设置编译器(然后使用xiar)时,这似乎只能正常工作。通过CMAKE_CXX_COMPILER
设置编译器时,将忽略此属性。
还有其他办法吗?一些推荐的方式?或者至少是解决方法?
答案 0 :(得分:5)
好的,既然这里没有答案,我也转向CMake mailing list列表寻求有关此问题的帮助。专家的同意似乎是我试图这样做的方式是一个相当糟糕的主意。原因是我的自定义标志的解析发生在初始化过程的后期。因此,应该依靠通过环境变量设置编译器,让CMake在初始配置运行期间发挥其魔力。我会修改我的方法..
答案 1 :(得分:2)
为方便起见,请快速回答一下,从源目录进行INTEL
构建:
mkdir INTEL
cd INTEL
cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_Fortran_COMPILER=ifort ..
(删除您不需要的语言)
答案 2 :(得分:1)
基本上,避免尝试更改编译器。请参阅FAQ: How do I use a different compiler?。 CMake工具链文件提供了一种支持某些复杂情况的方法,如异国情调的HPC编译器。