Ceres-Solver在VS2017下的配置
简介
Ceres Solver 是一个开源C++库,用于建模和解决大型复杂的优化问题。可以高效地解决具有边界约束的非线性最小二乘问题和一般的无约束优化问题。
准备工作
编译工具
- vs2017
- cmake
ceres工具包和第三方依赖库
- ceres-solover
- gflags
- glog
下载下来的依赖包如下:
开始编译
编译gflas
打开cmake-gui.exe,在source code中选择刚才所下载的gflas,如下:
点击config,根据自己情况选择编辑器,因为我是在vs2017下编译,且我最终需要的环境是64位,所以我的选择是Visual Studio 15 2017 Win64
再次点击config,这时候已经没有红框了,即配置正确,然后点击generate,生成解决方案,打开。
右键ALL_BUILD生成,如果没有报错,则gflas生成成功。接下去编译glog
编译glog
同理,在source code中选择刚才下载的glog,并指定编译位置,选择编译器。
点击config,这时候需要在指定先前生成的gflags的位置,如下:
再次点击config,这时候已经没有红框了,即配置正确,然后点击generate,生成解决方案,打开。
右键ALL_BUILD生成,如果没有报错,则glog生成成功。接下去编译ceres-solver。
编译ceres-solver
同理,在source code中选择刚才下载的ceres-solver,并指定编译位置,选择编译器。
点击config,这时候需要指定之前所下载的eigen库,并将EIGENSPARSE选上
再次点击config,指定先前的gflags和glog,如下:
再次点击config,指定CMAKE_BUILD_TYPE,如下:
再次点击config,这时候已经没有红框了,即配置正确,然后点击generate,生成解决方案,打开。
右键ALL_BUILD生成,如果没有报错,则ceres-solver生成成功。
按照这样子的一套流程,最后得到的是ceres的静态链接库,在使用的时候,需要包含头文件还有之前生成的静态链接库。
测试
打开cmd,切换到ceres-build/bin/Debug下,然后运行helloworld.exe,如果看到convergence的话,即收敛,说明编译成功。
遇到的问题
我在使用的时候遇到了一些错误:
1.
#error: ERROR macro is defined. Define GLOG_NO_ABBREVIATED_SEVERITIES before including logging.h. See the document for detail.
解决方法:在项目->属性->c/c++->预处理器->预处理器定义中加入
GLOG_NO_ABBREVIATED_SEVERITIES
根据官网给的信息,这是与windows.h下定义的ERROR发生了冲突。
2.
error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: void __cdecl google::LogMessageVoidify::operator&(class std::basic_ostream<char,struct std::char_traits<char> > &)"
解决方法:在项目->属性->c/c++->预处理器->预处理器定义中加入GOOGLE_GLOG_DLL_DECL=
这个报错信息是动态链接库中的函数信息有误,这是我比较奇怪的一点,因为生成的时候我并没有选择动态链接库而是采用了静态链接库,并不理解为什么会产生这个错误,不过官方文档给出了解决方案,如上。
另外我不明白为什么要加个=,我去看了代码,代码里的宏定义明明是GOOGLE_GLOG_DLL_DECL,希望能得到解答!
参考
http://ceres-solver.org/
http://www.cnblogs.com/youxin/p/4896540.html