基于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 - 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