文中有些部分筆者也不確定一定正確,如有問題歡迎指出
下載編譯 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 - x64 和 Release - 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_DIR 為 gflags-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_TYPE 為 Release; 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