ElasticFusion之Eigen+SuiteSparce编译

ElasticFusion之Eigen+SuiteSparce编译

最近在看ElasticFusion的文章,打算在Windows平台上进行复现,由于涉及到众多软件,故在此记录一下编译过程,以备后续升级软件使用。这篇主要记录Eigen和SuiteSparse的编译,后续会把整个过程记录下来。

1 软件下载与安装

1.1 Microsoft Visual Studio 2013

系统平台为Window 10,VS为Visual Studio 2013 Update 5。其他版本应该也能够使用,但为了能够尽快复现,这里使用ElasticFusion推荐的版本,以后会测试Visual Studio 2015和Visual Studio 2017。

1.2 CMake 3.7.2

下载并安装CMake,官网地址为官网,这里下载地址为CMake 3.7.2-win64-x64

1.3 Eigen 3.3.3

下载Eigen,官网地址为官网,这里下载地址为Eigen 3.3.3

1.4 SuiteSparse

下载最新版SuiteSparse,官网地址为官网,下载相应的ZIP压缩包。

2 SuiteSparse编译

详细步骤可参见网址,这里只做简要介绍。

2.1 SuiteSparse解压缩

将下载下来的SuiteSparse解压缩到文件夹,并重命名为SuiteSparse-Metis-VS2013,我这里的完整路径为D:\Source\ElasticFusion\SuiteSparse-Metis-VS2013,以下简称SP_ROOT。打开SP_ROOT/metis/CMakeLists.txt,在行

project(METIS)

后加上命令

cmake_policy(SET CMP0022 NEW)

修改后文件如下:

cmake_minimum_required(VERSION 2.8)
project(METIS)
cmake_policy(SET CMP0022 NEW)
set(GKLIB_PATH "GKlib" CACHE PATH "path to GKlib")
set(SHARED FALSE CACHE BOOL "build a shared library")

if(MSVC)
  set(METIS_INSTALL FALSE)
else()
  set(METIS_INSTALL TRUE)
endif()

# Configure libmetis library.
if(SHARED)
  set(METIS_LIBRARY_TYPE SHARED)
else()
  set(METIS_LIBRARY_TYPE STATIC)
endif(SHARED)

include(${GKLIB_PATH}/GKlibSystem.cmake)
# Add include directories.
include_directories(${GKLIB_PATH})
include_directories(include)
# Recursively look for CMakeLists.txt in subdirs.
add_subdirectory("include")
add_subdirectory("libmetis")
add_subdirectory("programs")

2.2 CMake运行

  • Where is the source code设置为SP_ROOT
  • Where to build the binaries设置为 SP_ROOT/Build
  • 按“Configure”,弹出的窗口选择Visual Studio 12 2013 Win64,需要选择Win64版
  • 按“Generate”

2.3 编译和安装

在Visual Studio,打开SuiteSparseProject.sln,并且建立Debug 和Release两种模式下的INSTALL 工程(设为启动项目)。SuiteSparseConfig.cmake应该位于install路径下,它将用于你的项目正确地连接到SuiteSparse。

3 测试

3.1 建立测试工程,源码如下

#include <iostream>  
#include "Eigen/Eigen"  
#include "Eigen/SPQRSupport"  
using namespace Eigen ;  
int main ( ) {  

    SparseMatrix < double > A ( 4 , 4 ) ;  
    std :: vector < Triplet < double > > triplets ;  

    // 初始化非零元素  
    int r [ 3 ] = { 0 , 1 , 2 } ;  
    int c [ 3 ] = { 1 , 2 , 2 } ;  
    double val [ 3 ] = { 6.1 , 7.2 , 8.3 } ;  
    for ( int i = 0 ; i < 3 ; ++ i )  
        triplets . push_back( Triplet < double >(r [ i ] , c [ i ] , val [ i ]) ) ;  

    // 初始化稀疏矩阵  
    A . setFromTriplets ( triplets . begin ( ) , triplets . end ( ) ) ;  
    std :: cout << "A = \n" << A << std :: endl ;  

    // 一个QR分解的实例  
    SPQR < SparseMatrix < double > > qr ;  
    // 计算分解  
    qr . compute ( A ) ;  
    // 求一个A x = b  
    Vector4d b ( 1 , 2 , 3 , 4 ) ;  
    Vector4d x = qr . solve ( b ) ;  
    std :: cout << "x = \n" << x ;  
    std :: cout << "A x = \n" << A * x ;  

    return 0 ;  
}  

3.2 设置包含文件和库文件

(1)附加包含目录

..\..\Eigen
..\..\SuiteSparse-Metis-VS2013\build\install\include\
..\..\SuiteSparse-Metis-VS2013\build\install\include\suitesparse

(2)附加库目录

..\..\SuiteSparse-Metis-VS2013\build\install\lib64
..\..\SuiteSparse-Metis-VS2013\build\install\lib\lapack_blas_windows
..\..\SuiteSparse-Metis-VS2013\build\install\lib

(3)附加依赖项
Debug模式下添加

libamdd.lib
libbtfd.lib
libcamdd.lib
libccolamdd.lib
libcholmodd.lib
libcolamdd.lib
libcxsparsed.lib
libklud.lib
libldld.lib
libspqrd.lib
libumfpackd.lib
suitesparseconfigd.lib
libblas.lib
liblapack.lib
metisd.lib

Release模式下添加

libamd.lib
libbtf.lib
libcamd.lib
libccolamd.lib
libcholmod.lib
libcolamd.lib
libcxsparse.lib
libklu.lib
libldl.lib
libspqr.lib
metis.lib
suitesparseconfig.lib
libblas.lib
liblapack.lib

在生成的Debug文件夹下加入SP_ROOT\build\install\lib\lapack_blas_windows中的dll

libblas.dll
libgcc_s_dw2-1.dll
libgfortran-3.dll
liblapack.dll
libquadmath-0.dll

3.3 运行

进行如上设置后,程序即可正常运行,结果如下:
Eigen

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章