由于想要做一些优化处理的工作,所以今天花了几个小时编译了一下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,不出意外应该没什么问题(这里我出问题了,等了三十分钟,结果编译出现一些错误,看建议)
测试与使用
1. helloword
错误 4 error LNK2019: 无法解析的外部符号 __imp__PathMatchSpecA@8,该符号在函数 "public: class std::basic_string,class std::allocator > __thiscall google::`anonymous namespace'::CommandLineFlagParser::ProcessOptionsFromStringLocked(class std::basic_string,class std::allocator > const &,enum google::FlagSettingMode)" (?ProcessOptionsFromStringLocked@CommandLineFlagParser@?A0x59ef3969@google@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV45@W4FlagSettingMode@3@@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