配置SuiteSparse

为了在新机器上跑自己的PointResampling程序, 大概搞了两三天终于配置完了, 呼呼~ 主要还是困在了SuiteSparse的配置上, 导致花了不少时间…… (从这篇文章开始, 改变行文风格啦, 比如用英文标点符号和少用Latex代码, 因为突然发觉以前的文章好难看……)

一开始在项目中的CMakeList.txt中使用find_package(SuiteSparse REQUIRED)命令死活找不到SuiteSparse, 查了下find_package原理(参考自CMake之find_package):

首先明确一点, CMake本身不提供任何搜索库的便捷方法, 所有搜索库并给变量赋值的操作必须由CMake代码完成, 比如下面将要提到的FindXXX.cmake和XXXConfig.cmake. 只不过, 库的作者通常会提供这两个文件, 以方便使用者调用.

find_package采用两种模式搜索库:

Module模式: 搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件, 执行该文件从而找到XXX库. 其中, 具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由FindXXX.cmake模块完成.

Config模式: 搜索XXX_DIR指定路径下的XXXConfig.cmake或者XXX-config.cmake文件, 执行该文件从而找到XXX库. 其中具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake或者XXX-config.cmake模块完成.

两种模式看起来似乎差不多, 不过CMake默认采取Module模式, 如果Module模式未找到库, 才会采取Config模式. 如果XXX_DIR路径下找不到XXXConfig.cmake或者XXX-config.cmake文件, 则会找/usr/local/lib/cmake/XXX/中的XXXConfig.cmake或者XXX-config.cmake文件. 总之, Config模式是一个备选策略. 通常, 库安装时会拷贝一份XXXConfig.cmake或者XXX-config.cmake文件到系统目录中, 因此在没有显式指定搜索路径时也可以顺利找到.

回到我们的问题来, CMake默认采用Module模式去找FindSuiteSparse.cmake文件, 在我的电脑上找到的是CGAL目录下的文件, 然后就不知道为何找不到, 所以需要强制执行Config模式. 具体方法是:

set(SuiteSparse_DIR $ENV{SuiteSparse_DIR})

find_package(SuiteSparse REQUIRED CONFIG)

即先设置SuiteSparse_DIR, 再指定find_package的模式为CONFIG.

这样就可以找到suitesparse-config.cmake文件, 但执行到find_dependency(LAPACK CONFIG)会再度报错, 提示找不到LAPACK_DIR. 奇怪的是, 自己明明设置了LAPACK_DIR为系统变量中LAPACK_DIR的值,

set(LAPACK_DIR $ENV{LAPACK_DIR})

但不知道为何$ENV{LAPACK_DIR}始终为空…… 所以最后自己只是在CMake的GUI界面中手动指定了LAPACK_DIR才得以解决.

PS: 在VS中编译工程时还出现了头文件CholmodSupport.h编译出错的情况, 这个只是Eigen版本的问题, 使用Eigen最新版本的CholmodSupport.h即可.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注