基于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:WindowsSystem32 目录下

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
原文地址:https://www.cnblogs.com/Pyrokine/p/14636228.html