1. 程式人生 > >vs2013下配置ceres solver

vs2013下配置ceres solver

由於想要做一些優化處理的工作,所以今天花了幾個小時編譯了一下ceres solver,這裡對我的安裝過程做個記錄,希望對大家有些幫助。

Ceres Solver是由Google開發的非線性最小二乘問題的求解工具。

在Windows下使用Ceres,需要必備的庫有eigen,glog,gflags三個,可選的還有suitesparse,不過由於時間關係,suitesparse我沒有編譯,等有空的時候,搞一下吧。

Ceres用的是ceres-solver-1.11.0

eigen用的是eigen-3,此外還有glog,gflags,cmake-3.6.1-win32-x86

Suitesparse用的是 suitesparse-metis-for-windows  

我等下會給出下載連結。

1. 檔案佈局

首先將ceres、gflags、eigen,glog解壓放到同一個資料夾中,如D:/ceres;

2. 安裝CMAKE,安裝隨意

3, 編譯glags,glog

這裡開啟glog-master資料夾,找到google-glog.sln,雙擊開啟。可能會存在VS版本不同的問題(這個小問題),載入完以後,直接編譯就可以。對應Debug和Release模式,會分別生成連結庫。Debug生成結果如下圖:

之後編譯glags,由於glag裡面沒有*.sln檔案,所以這裡需要用Cmake。

進入gflags-master資料夾,在裡面新建build_test資料夾,開啟cmake,如下圖所示,點選第一個browse sourse,設定原始碼所在位置,點選第二個browse sourse,設定生成檔案所在位置,這個位置,會生成一個.sln 檔案。

點選configure,之後generate,OK。生成結果如下:

注意:(此部分在2013編譯未出現,在2017編譯中出現)在生成中可能會出現  error C3861: “snprintf”: 找不到識別符號  

通過檢視函式定義,可以發現程式中函式實現部分未啟用(如下圖),然後寫著msvc 2015 already defines,懷疑是VS的版本問題。專案右鍵屬性---常規---windows SDK版本,修改為10.0.15063.0(之前是8.1,),然後重新編譯,通過。

同glog一樣,用開啟,編譯。針對debug和release可以分別生成庫檔案。

4. 編譯ceres

利用cmake生成ceres,首先在 D:\ceres\ceres-solver-1.11.0中新建build檔案用於存放編譯結果,如圖: 

點選configure,選擇visual stutio 12 2013編譯環境。

注意:

configure會存在一些錯誤,主要是由於沒有將eigen、gflags和glog及其編譯後的lib的路徑加進去導致的,加上後就可以了。 


另:eigen庫直接解壓即可,不需要另外編譯

設定目錄如下:

EIGEN_INCLUDE_DIR為”D:\ceres\eigen“ 
GLOG_INCLUDE_DIR為”D:\ceres\glog-master\src\windows“
GLOG_LIBRARY為”D:\ceres\glog-master\Debug\libglog.lib“
GFLAGS_INCLUDE_DIR為"D:\ceres\gflags-2.0"
GFLAGS_LIBRARY為"D:\ceres\gflags-2.0\Debug\libgflags-debug.lib"

建議:將選項中的EIGENSPARSE勾上!!!不要問我為什麼,嘗試過,也錯過,不想你們走彎路,雖然我還不清楚為什麼要這樣。

這裡要根據自己的檔名稱,安裝位置,修改為指定資料夾。
再次configure done和generate done表示成功。 

最後,開啟ceres.sln,生成ALL_BUILD,不出意外應該沒什麼問題(這裡我出問題了,等了三十分鐘,結果編譯出現一些錯誤,看建議)


建議:
開啟之後可以看到很多解決方案,除了ceres之後其他都是例子,這裡可以只生成ceres,注意在生成ceres時,為防止gflag與windows對GDI呼叫時對error設定的衝突,可以用前處理器解決,方法是:在右鍵ceres屬性-配置屬性-C/C++-前處理器(Preprocessor)-前處理器定義處加上GLOG_NO_ABBREVIATED_SEVERITIES,注意不要把原來這裡的定義刪掉。
5. 全部生成完成之後,可以\ceres目錄下新建Include,Library兩個資料夾 
      
標頭檔案
將\ceres\ceres-solvers-1.11.0\include下的資料夾ceres複製到Include下;
將\ceres\ceres-solver build\config\ceres\internal下檔案config.h複製到\ceres\Include\ceres\internal中;
將\ceres\glog-master\src\windows下的glog資料夾複製到Include下;
將\ceres\gflags-build\include下的gflags資料夾複製到Include下;
將\ceres\eigen 3下的Eigen資料夾複製到\ceres\Include\ceres下; 

庫檔案(以32Debug為例)

將\ceres\glog-master\Debug下libglog.dll複製到系統盤\Windows\System32下;
將\ceres\glog-master\Debug下libglog.lib複製到\ceres\Library;
將\ceres\ceres-solver build\32Debug\lib\Debug下的ceres-debug.lib複製到\ceres\Library;
將\ceres\gflags-build\lib\Debug下的gflags_static.lib和gflags_nothreads_static.lib複製到\ceres\Library;
測試與使用

1. helloword

新建一個helloword的工程檔案;
將\ceres\ceres-solver-1.11.0\examples中的helloworld.cc檔案複製到工程檔案中;
設定工程的包含檔案:專案 - helloworld屬性 - VC++目錄 - 包含目錄 上新增D:\ceres\Include;
新增附加依賴項:專案 - helloworld屬性 - 聯結器 - 輸入 - 附加依賴項 上新增D:\ceres\Library\ceres-debug.lib和C:\ceres\Library\libglog.lib。
生成專案並開始執行,最終會在命令視窗中看到convergence,收斂,證明成功了

注意:可能會提示缺少libglog.dll檔案,那麼把生成的libglog.dll檔案複製到這個測試檔案的Debug檔案中,即可執行。
2. circle_fit
同1一樣,新建circle_fit專案,專案 - 屬性 - VC++目錄 - 包含目錄,新增D:\ceres\Include;
專案- 屬性-連結器-常規 -附加庫目錄,新增 D:\ceres\lib,
專案- 屬性- 連結器 -輸入 - 附加依賴性,新增 ceres-debug.lib
libglog.lib
gflags_nothreads_static.lib
gflags_static.lib
然後編譯執行即可。
注意,可能會出現錯誤
錯誤    4    error LNK2019: 無法解析的外部符號 [email protected],該符號在函式 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall google::`anonymous namespace'::CommandLineFlagParser::ProcessOptionsFromStringLocked(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,enum google::FlagSettingMode)" ([email protected]@[email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@Z) 中被引用    E:\Projects_Windows\test_ceres\circle_fit\gflags_nothreads_static.lib(gflags.obj)    circle_fit
錯誤    5    error LNK1120: 1 個無法解析的外部命令    E:\Projects_Windows\test_ceres\Debug\circle_fit.exe    1    1    circle_fit
 

解決方法:在專案-屬性-連結器-輸入中新增 shlwapi.lib
把程式碼中CERES_GFLAGS_NAMESPACE替換為GFLAGS_NAMESPACE,程式碼前面新增 using namespace GFLAGS_NAMESPACE;
3. curve_fit
同2一樣,複製ceres中的example中的curve_fit.cc,新建專案,新增配置。直接編譯,執行,無錯誤。
--------------------- 
作者:chengwei0019 
來源:CSDN 
原文:https://blog.csdn.net/u012700322/article/details/75321609 
版權宣告:本文為博主原創文章,轉載請附上博文連結!