引子
因為項目需要用到Ceres Solver這個庫實現(xiàn)非線性優(yōu)化押框,這幾天投入了很多時間來學(xué)習(xí)研究吝羞。沒想到的是,這個庫的安裝就非常繁瑣默赂。官方的安裝指南寫的卻過于簡略。尤其是在Windows環(huán)境下括勺,問題bug不斷缆八,很多坑。經(jīng)過三天努力疾捍,今天終于成功hello world奈辰。高興之余趕快趁機把安裝過程記錄下來,以便備忘乱豆。本文除了記錄Ceres Solver的安裝過程之外奖恰,還詳細記錄了gflags,glog宛裕,SuiteSpares的安裝過程瑟啃,尤其是一些配置選項。希望能對其他人有些許的幫助揩尸。
Ceres Solver是一個C++環(huán)境下的非線性最小二乘問題的求解工具包蛹屿,可用來建模并解決大型復(fù)雜的非線性最小二乘問題。這個工具包已經(jīng)廣泛被用于很多商業(yè)軟件中疲酌。在google project里面有它的主頁: http://code.google.com/p/ceres-solver/蜡峰。
環(huán)境
- Windows 10 Pro
- Visual Studio 2015
- Cmake GUI 3.10.2
安裝前的準備
- Ceres-solver 1.13.0
- 下載地址:https://ceres-solver.googlesource.com/ceres-solver/+/1.13.0
- 點擊【tgz】下載,下載后需要解壓兩層才能獲得Ceres源代碼朗恳。
- Eigen 3.3.4
- 下載地址:http://eigen.tuxfamily.org/index.php?title=Main_Page
- 著名的矩陣運算庫湿颅。
- gflags 2.2.1
- 下載地址:https://github.com/gflags/gflags
- GFlags是Google開源的一個命令行flag(區(qū)別于參數(shù))庫。
- glog
- 下載地址:https://github.com/google/glog
- Google Glog是Google的一個開源庫粥诫,用于實現(xiàn)應(yīng)用級別的logging油航。 它提供了一系列類似于C++流風(fēng)格的logging API,以及一些預(yù)定義的宏怀浆。它有點類似于C里面的assert谊囚,但是比它具備更豐富的輸出信息以及使用靈活性怕享。
- 我用的是 2018年2月27日的commit版本。相比最新的release 0.3.5 (發(fā)布于2017年5月)镰踏,此commit版去掉了已經(jīng)生成VS的工程文件(.sln)函筋。安裝過程更可控。
- suitesparse-metis-for-windows Release 1.3.1
- 下載地址:https://github.com/jlblancoc/suitesparse-metis-for-windows
- 這個并不是必須安裝的依賴庫奠伪。但是如果裝上將會提高Ceres對稀疏矩陣的計算性能跌帐,提供更多可用的優(yōu)化算法。所以雖然加入這個庫之后Ceres的安裝過程會更加繁瑣绊率,但是仍然推薦安裝谨敛。這個庫的原生版本本身對Windows的支持不好,所以在Windows上要使用這個專門針對Windows的衍生版本滤否。另外脸狸,這個庫還存在一個名為CXSparse的簡化版本。
建立一個文件夾藐俺,如C:\Ceres_Install
炊甲,并在此文件夾內(nèi)為每個依賴庫建立一個子文件夾存放源代碼。然后把所有源代碼解壓放到對應(yīng)的子文件夾內(nèi)紊搪。另外為每個庫再建立一個按照"庫名-build"命名的文件夾蜜葱,盛放生成后的工程文件。
安裝Eigen
Eigen庫本身是并不需要安裝的耀石,解壓放在某文件夾內(nèi)即可牵囤。但是我更希望將他們這些庫放在同一位置方便管理,如C:\Program Files
滞伟。這樣也方便其他庫的定位揭鳞。
啟動CMake GUI。指定源代碼位置為C:/Ceres_Install/eigen-eigen
梆奈,輸出位置為C:/Ceres_Install/eigen-build
野崇。編譯平臺根據(jù)系統(tǒng)環(huán)境選擇“Visual Studio 14 2015 Win64”,下同亩钟。
配置選項中:
- 取消所有的Test類項乓梨。
- CMAKE_INSTALL_PREFIX = C:/Program Files/Eigen3
因為要安裝目錄位于C:/Program Files/
,所以必須以管理員身份運行Visual Studio 2015清酥,否則沒有讀寫權(quán)限扶镀。然后打開C:/Ceres_Install/eigen-build/Eigen3.sln
解決方案。分別以Debug和Release模式(x64)生成INSTALL項目以完成安裝焰轻。
安裝gflags
啟動CMake GUI臭觉。指定源代碼位置為C:/Ceres_Install/gflags
,輸出位置為C:/Ceres_Install/gflags-build
。同樣Configure->選擇平臺VS2015 x64->設(shè)置配置選項->Generate蝠筑。
配置選項中:
- 取消選中BUILD_Testing
- CMAKE_INSTALL_PREFIX = C:/Program Files/gflags
- !!! 選中BUILD_SHARED_LIBS 以便生成.dll文件
以管理員身份運行Visual Studio 2015狞膘,打開剛生成的對應(yīng)解決方案gflags.sln
。分別以Debug和Release模式(x64)生成ALL_BUILD項目以編譯生成二進制文件什乙。然后分別以Debug和Release模式(x64)生成INSTALL項目以完成安裝挽封。
安裝glog
同樣的過程,使用CMake將glog的源代碼生成為VS工程文件放入glog-build
文件夾稳强。同樣也要注意CMake配置選項场仲。
配置選項中:
- 取消選中BUILD_TESTING
- CMAKE_INSTALL_PREFIX = C:/Program Files/glog (如果用release 0.3.5 默認google-glog)
- 選中WITH_GFLAGS
- gflags_DIR = C:/Program Files/gflags/lib/cmake/gflags
- !!! 選中BUILD_SHARED_LIBS以便生成.dll文件和悦。如果該項不存在通過“Add Entry”手動加入退疫。
以管理員身份運行Visual Studio 2015,打開剛生成的對應(yīng)解決方案glog.sln
鸽素。分別以Debug和Release模式(x64)生成ALL_BUILD項目和INSTALL項目褒繁。
安裝SuiteSparse (optional)
SuiteSparse 的安裝就相對前兩個庫麻煩一點。
首先依然是cmake-configure-generate馍忽。
配置選項中:
- 取消選中BUILD_METIS棒坏,否則在編譯METIS庫是會發(fā)生很多莫名其妙的錯誤。
- 取消選中HAVE_COMPLEX遭笋,否則也會有很多莫名其妙的錯誤坝冕,這些錯誤和平臺的兼容性有關(guān)。
- SUITESPARES_INSTALL_PREFIX = C:/Program Files/suitesparse (!!!默認
C:/Ceres_Install/suitesparse-build/install
)瓦呼。- !!! 取消選中SHARED喂窟。如果選中會報錯,宣稱缺少一系列
.lib
文件央串。- OPENMP根據(jù)需要設(shè)置磨澡。
以管理員身份運行Visual Studio 2015,打開剛生成的對應(yīng)解決方案SuiteSparseProject.sln
质和。分別以Debug和Release模式(x64)生成ALL_BUILD項目和INSTALL項目 稳摄。雖然很多警告,但是仍然可以成功編譯饲宿。但是目前只生成了靜態(tài)庫文件厦酬,我們還需要動態(tài)鏈接庫,即.dll
文件瘫想。
下面我們在剛才的CMake中仗阅, 重新選中SHARED項,其他項不變殿托,再次點擊generate霹菊。之后用Visual Studio重新打開此解決方案。然后此時重新以Debug和Release模式(x64)分別再次生成ALL_BUILD項目和INSTALL項目。因為再上一過程中.lib
文件已經(jīng)被生成并且安裝(上一輪編譯一定要生成INSTALL)旋廷,所以這時不會再報錯說缺少.lib
文件了鸠按。此時四個依賴庫都安裝完畢,下面是主角Ceres了饶碘。
安裝Ceres-Solver
安裝Ceres的主要困難在于復(fù)雜的CMakeList配置程序目尖。在第一次Configure會得到一個長長的屬性列表。因為Ceres默認使用的是SuiteSparse庫扎运,而經(jīng)過改造的suitesparse-metis-for-windows的配置文件所給出的很多CMake變量(對外接口)與Ceres的接口對不上瑟曲。因此需要手動添加很多內(nèi)容,這也是最坑爹之處豪治。
根據(jù)長時間的摸索洞拨,不斷地實驗和對CMakeList文檔的研究,得出以下可行配置负拟。
配置選項中:
- 取消選中BUILD_EXAMPLES烦衣。為了節(jié)省后續(xù)編譯時間。
- 取消選中BUILD_TESTING掩浙。為了節(jié)省后續(xù)編譯時間花吟。
- 選中BUILD_SHARED_LIBS,以便生成動態(tài)鏈接庫文件厨姚。
- CMAKE_BUILD_TYPE 設(shè)為 Release衅澈。
- 選中CUSTOM_BLAS。
- 添加BLAS_LIBRARIES項(FILEPATH類)賦值
C:/Program Files/suitesparse/lib64/lapack_blas_windows/libblas.lib
- 選中LAPACK谬墙。
- 添加LAPACK_LIBRARIES項(FILEPATH類)賦值
C:/Program Files/suitesparse/lib64/lapack_blas_windows/liblapack.lib
今布。- 選中EIGENSPARSE。如果之前沒有安裝Eigen芭梯,只是解壓险耀。這里還需要手動配置EIGEN_INCLUDE_DIR項或Eigen3_DIR。
- GFLAGS和GLOG是否被選中玖喘,并且正確定位甩牺。如果安裝在C盤Program FIles應(yīng)該可以自動定位。
- 選中SUITESPARSE累奈,注意這一選項會自動取消選中贬派。
- 添加SUITESPARSE_CHECK_INCLUDE_DIRS項(PATH類)賦值
C:/Program Files/suitesparse/include
,提示suitesparse組件頭文件位置澎媒。- 添加SUITESPARSE_CHECK_LIBRARY_DIRS項(PATH類)賦值
C:/Program Files/suitesparse/lib64
搞乏,提示suitesparse組件庫文件位置。- !!! 添加CMAKE_INSTALL_PREFIX 賦值
C:/Program Files/Ceres
戒努。
用管理員身份啟動VS请敦,打開剛剛生成的Ceres解決方案。切換編譯器為Release模式。然后生成ALL_BUILD和INSTALL項目侍筛,完成Release模式的編譯和安裝過程萤皂。
現(xiàn)在切換到Debug模式。然后右鍵單擊“ceres”項目->屬性->C/C++->鏈接器->輸入->附加依賴項匣椰。這里要注意屬性管理也應(yīng)設(shè)為Debug模式裆熙。
將下列庫:
C:\Program Files\suitesparse\lib64\libspqr.lib
C:\Program Files\suitesparse\lib64\libcholmod.lib
C:\Program Files\suitesparse\lib64\libccolamd.lib
C:\Program Files\suitesparse\lib64\libcamd.lib
C:\Program Files\suitesparse\lib64\libcolamd.lib
C:\Program Files\suitesparse\lib64\libamd.lib
C:\Program Files\suitesparse\lib64\suitesparseconfig.lib
改為(文件名后加d表示debug模式對應(yīng)的庫):
C:\Program Files\suitesparse\lib64\libspqrd.lib
C:\Program Files\suitesparse\lib64\libcholmodd.lib
C:\Program Files\suitesparse\lib64\libccolamdd.lib
C:\Program Files\suitesparse\lib64\libcamdd.lib
C:\Program Files\suitesparse\lib64\libcolamdd.lib
C:\Program Files\suitesparse\lib64\libamdd.lib
C:\Program Files\suitesparse\lib64\suitesparseconfigd.lib
其他庫和設(shè)置保持原樣。
此時重新生成ALL_BUILD和INSTALL禽笑。完成Debug模式的編譯和安裝入录。
關(guān)于這一部分的配置也可以通過修改CMakeList實現(xiàn),如果對cmake編程熟練甚至可以重寫FindSuiteSparse以實現(xiàn)自動配置佳镜。這里推薦這篇文章《Ceres-Solver庫使用(一)--windows下安裝配置》僚稿。
配置環(huán)境變量
我的電腦->屬性->更改設(shè)置->高級->環(huán)境變量->系統(tǒng)變量->Path->編輯。注意設(shè)置完環(huán)境變量之后需要重啟Visual Studio以生效邀杏。
在PATH中加入以下五個地址:
C:\Program Files\Ceres\bin
C:\Program Files\gflags\bin
C:\Program Files\glog\bin
C:\Program Files\suitesparse\bin
C:\Program Files\suitesparse\lib64\lapack_blas_windows
至此贫奠,Ceres(含SuiteSparse)安裝過程完成。
測試
在C:/Ceres_Install/ceres-solver/examples
有很多實例望蜡。我一般使用VS新建工程然后復(fù)制C++源代碼的形式測試。這樣各個項目不會互相影響拷恨。不建議用CMake脖律。
要記得在屬性中加入各種庫Include路徑和Lib文件路徑。包括涉及到的各種庫:Ceres腕侄、Eigen小泉、SuiteSparse、gflags冕杠、glog等等微姊。最好Debug和Release模式分別測試一下運行狀況。
主要參考資料
*ceres-solver庫編譯說明 http://blog.csdn.net/liminlu0314/article/details/15860677
*Eigen+suitesparse for windows 安裝 http://blog.csdn.net/xiamentingtao/article/details/50100549
*官方安裝指南 http://ceres-solver.org/installation.html#windows