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

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