【发布时间】:2017-11-23 08:21:25
【问题描述】:
我想将英特尔 MKL 库(包括 Pardiso 求解器)与 Eigen3 一起使用。当我在 CMake 中手动指定编译器选项时,我让它工作(为此我遵循了Intel Link Line Advisor)。但我知道有一种通过FindBLAS.cmake 和BLA_VENDOR 环境变量的预定义方式,特别是使用由Eigen 修改的FindBLAS.cmake。只有我坚持这一点。我应该如何写我的CMakeLists.txt?
我应该强调在集群上使用最新的 Eigen3 版本,因此已将其“安装”在我的主文件夹中一个重要的位置。同样在简单使用后
cmake /path/to/eigen3 -DCMAKE_INSTALL_PREFIX:PATH=$HOME/opt
make install
我没有得到第三方 CMake 文件。
编辑
我找到了一个似乎可以正常工作的解决方案:
cmake_minimum_required(VERSION 2.8.12)
project(main)
set(PROJECT_LIBS "")
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# find Eigen3, use an environment variable that specifies the root of the Eigen download:
# export EIGENPATH="/path/to/clone/of/eigen3/"
list(APPEND CMAKE_MODULE_PATH "$ENV{EIGENPATH}/cmake/")
find_package(Eigen3 3.3.0)
include_directories(${EIGEN3_INCLUDE_DIRS})
# enable Intel-MKL (only for Intel compilers)
# NB requires correct specification of BLA_VENDOR, e.g.
# export BLA_VENDOR=Intel10_64lp_seq
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
find_package(BLAS)
include_directories(${BLAS_INCLUDE_DIRS})
set(PROJECT_LIBS ${BLAS_LIBRARIES})
add_definitions(-DEIGEN_USE_MKL_ALL)
endif()
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBS})
请注意,重要的是要注意 Eigen 的“安装”不适用于此解决方案,因为 pkg-config 上的 piggy-bagging 在这里是不够的。 IE。应该只下载/克隆 Eigen 并将 CMake 指向下载位置。
【问题讨论】:
-
那么,当您尝试简单地使用
find_package(NAME)时它不起作用?哪些变量没有准确设置?缺少哪些编译器标志? -
@Ptaq666 我添加了到目前为止我尝试过的所有内容(除了我自己的
FindMKL.cmake版本,它与本次讨论无关)。 -
尝试从 CMake 打印所有包含目录。下面是一些示例:stackoverflow.com/questions/6902149/…。似乎某些
findXXX.cmake脚本没有设置所有适当的包含目录。解决它的一种残酷方法是添加target_include_directories(appropriate_target PUBLIC DIR_WITH_mkl.h)。 -
@Ptaq666 感谢您为我指明正确的方向。我已将我的解决方案发布为我的问题的编辑。如果您发现改进,请发表评论(或更改)。
标签: c++ cmake intel-mkl eigen3