基於Win10+VS2019的ceres-solver-2.0.0配置流程


文中有些部分筆者也不確定一定正確,如有問題歡迎指出

下載編譯 ceres 所需的資源(下面為本文所使用的版本),編譯器使用 VS2019 自帶的 MSVC ,所有庫均編譯 Debug 和 Release 版本

eigen-3.3.9
https://eigen.tuxfamily.org/index.php?title=Main_Page
gflags-2.2.2
https://github.com/gflags/gflags
glog-0.4.0
https://github.com/google/glog
ceres-solver-2.0.0
https://github.com/ceres-solver/ceres-solver
cmake-3.20.1
https://cmake.org/download/

 然后將四個壓縮包解壓到同一個文件夾下,當然不在一個文件夾下也可以,只用在配置路徑的時候修改為對應路徑即可

編譯順序為 gflags -> glog -> ceres,eigen 在 ceres 編譯之前任意時候編譯均可,那么先編譯 eigen 庫好了(官方文檔里順序是先 glog 后 gflags)

 

Eigen

在 eigen 文件夾下創建 eigen-build 文件夾,文件夾命名沒有限制,使用其他名稱或路徑在配置時修改為對應路徑即可,筆者均將編譯文件夾放在對應庫下,文件夾命名為 庫名-build

在源碼路徑( Where is the source code: )中填寫 eigen 文件夾路徑,在編譯路徑( Where to build the binaries )填寫 eigen-build 文件夾路徑,然后點擊 Configure ,如果安裝了VS2019默認會選擇上,4 和 5 步保持默認即可,其他版本的編譯器則根據實際情況選擇

取消勾選 BUILD_TESTING(不取消也可以) ,將 CMAKE_INSTALL_PREFIX 修改為 C:/Program Files/Eigen3(好像修改了也沒有什么變化,不改也沒問題),再點一次 Configure ,所有的紅色條都沒有了(除非有錯誤),然后點擊 Generate 生成 VS 工程,然后點擊 Open Project 打開工程

如果界面關掉了可以在 eigen-build 下找到 Eigen3.sln 文件打開工程,其他庫同理,找到 sln 文件即可打開工程

分別選擇 Debug - x64Release - x64 然后點擊 重新生成 ALL_BUILD

 

即可獲得兩個文件夾(不過 eigen 庫不用編譯也沒問題,但編譯了也不會有問題,所以編譯了吧)

 

gflags

創建 gflags-build 文件夾

相同操作

勾選 BUILD_SHARED_LIBS 生成 lib 文件,將 CMAKE_INSTALL_PREFIX 修改為 C:/Program Files/gflags ,然后點擊 Configure 消紅

 

 點擊 Generate 生成 VS工程后點擊 Open Project 打開工程

兩個模式分別編譯

 即可得到兩個文件夾

 

glog

創建文件夾

配置文件夾

勾選 BUILD_SHARED_LIBS 生成 lib 文件,將 CMAKE_INSTALL_PREFIX 修改為 C:/Program Files/glog勾選 WITH_GFLAGS(默認已勾選) ,設置 gflags_DIRgflags-build 路徑,再次 Configure 消紅然后 Generate,成功后打開 VS 工程

分別編譯 Debug 和 Release,結果如下

 得到兩個文件夾

 

ceres

新建文件夾,前面的編譯大概率能夠一遍通過,ceres 的話還是很容易出問題的,如果報錯了只能多借助搜索引擎了

配置文件夾

勾選 BUILD_SHARED_LIBS 生成 lib 文件,將 CMAKE_INSTALL_PREFIX 修改為 C:/Program Files/Ceres

勾選 EIGENSPARSE(默認已勾選) 和 GFLAGS ,設置 eigen 、 gflags 和 glog 的相關目錄

點擊 Configure 后設置 CMAKE_BUILD_TYPERelease; Debug

再次 Configure 消紅,Generate 后打開工程

這時可以嘗試編譯一下,但 Debug 版本很可能會出現 文件長度超過260字符 的錯誤,此時需要修改注冊表解除文件長度限制,然后重啟電腦(注銷用戶也可以)

再次編譯

可獲得兩個文件夾

 

但這時里面的程序還是無法運行的,有三個辦法(注意對應的 Debug 和 Release 版本)

1、將 glog.dll 和 gflags.dll 兩個文件拷貝到運行目錄下

2、將 glog.dll 和 gflags.dll 兩個文件拷貝到 C:\Windows\System32 目錄下

3、將編譯文件夾添加到系統環境中后重啟電腦或注銷用戶(但有時依舊會找不到文件)

右鍵我的電腦 - 屬性 - 高級系統設置 - 環境變量 - 系統變量 - PATH

然后添加對應版本的包含 dll 文件的路徑即可

 

配置完 dll 文件之后運行 helloworld.exe 文件測試下

在地址欄中輸入 cmd ,然后輸入 helloworld.exe ,即可得到以下結果,出現 CONVERGENCE 即為收斂

 

在 VS2019 中使用

首先創建一個工程 test_ceres ,然后將 ceres-solver-2.0.0/examples/helloworld.cc 拷貝到 test_ceres/test_ceres/ 目錄下並添加進工程,將工程切換到 Release - x64 ,后續添加的文件版本都是 Release 版本

項目根目錄下創建 include lib 兩個文件夾

在 調試 - test_ceres 調試屬性 - 配置屬性 - VC++ 目錄 - 包含目錄 中添加 ..\include\

在 調試 - test_ceres 調試屬性 - 配置屬性 - VC++ 目錄 - 庫目錄 中添加 ..\lib\

 

添加頭文件

將下列文件夾復制到 test_ceres/include/ 目錄下

ceres-solver-2.0.0/include/ceres(文件夾) 

eigen-3.3.9/Eigen(文件夾)

gflags-2.2.2/gflags-build/include/gflags(文件夾)

glog-0.4.0/glog-build/glog(文件夾)

 

此時運行還會報以下錯誤,將這些文件拷貝到對應目錄下

錯誤 C1083 無法打開包括文件: “glog/log_severity.h”: No such file or directory

glog-0.4.0/src/glog/log_severity.h 復制到 test_ceres/include/glog/log_severity.h

錯誤 C1083 無法打開包括文件: “ceres/internal/config.h”: No such file or directory

ceres-solver-2.0.0/config/ceres/internal/config.h 復制到 test_ceres/include/ceres/internal/config.h

錯誤 C1189 #error: One of CERES_USE_OPENMP, CERES_USE_CXX_THREADS or CERES_NO_THREADS must be defined.

意為沒指定以哪種方式運行 ceres ,在 調試 - test_ceres 調試屬性 - 配置屬性 - C/C++ - 預處理器 - 預處理器定義 中添加 CERES_USE_CXX_THREADS

錯誤 C3861 “M_2_SQRTPI”: 找不到標識符

調試 - test_ceres 調試屬性 - 配置屬性 - C/C++ - 預處理器 - 預處理器定義 中添加 _USE_MATH_DEFINES

錯誤 C4996 'j0': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _j0. See online help for details.

打開對應文件找到 600 行,可以發現有 j0 j1 jn 三個函數,同時有一個宏定義,開啟后則使用 _j0 _j1 _jn

因此在 調試 - test_ceres 調試屬性 - 配置屬性 - C/C++ - 預處理器 - 預處理器定義 中添加 CERES_MSVC_USE_UNDERSCORE_PREFIXED_BESSEL_FUNCTIONS

 

添加庫文件

將下面的文件復制到 test_ceres/lib/ 目錄下

ceres-solver-2.0.0/ceres-build/lib/Release/ceres.lib

gflags-2.2.2/gflags-build/lib/Release/gflags.lib

glog-0.4.0/glog-build/Release/glog.lib

在 調試 - test_ceres 調試屬性 - 配置屬性 - 鏈接器 - 輸入 - 附加依賴項 中添加庫的名稱(一行一個

ceres.lib
gflags.lib
glog.lib

 

添加動態鏈接庫

將下面的文件復制到 test_ceres/test_ceres/ 目錄下,當然可以使用上文提到的方法 2 或 方法 3 來添加動態鏈接庫

ceres-solver-2.0.0/ceres-build/bin/Release/ceres.dll

gflags-2.2.2/gflags-build/bin/Release/gflags.dll

glog-0.4.0/glog-build/Release/glog.dll

 

此時再運行即可得到和前面運行 helloworld.exe 相同的結果了……當如不是,因為沒有編譯 suitesparse 

 因此配置里添加下面這一句指定求解器類型

options.linear_solver_type = ceres::DENSE_QR;

 即可得到相同的結果了

 

 

感謝

Windows環境下配置Ceres(含Eigen、gflags、glog、merit、suitesparse)
https://blog.csdn.net/xixihaha369300/article/details/83546473

Win10 x64 vs2017 下配置Ceres Solver 環境
https://blog.csdn.net/maoluluzuibang/article/details/79508321

Win10+vs2017配置Ceres
https://blog.csdn.net/wonder1113/article/details/88725646

Ceres Solver Docs
http://ceres-solver.org/installation.html#windows

如何使Windows 10接受超過260個字符的文件路徑
https://cn.compozi.com/5800-how-to-make-windows-10-accept-file-paths-over-260-characters

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM