vs2013下配置ceres solver

由于想要做一些优化处理的工作,所以今天花了几个小时编译了一下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,不出意外应该没什么问题(这里我出问题了,等了三十分钟,结果编译出现一些错误,看建议)


建议:
打开之后可以看到很多解决方案,除了ceres之后其他都是例子,这里可以只生成ceres,注意在生成ceres时,为防止gflag与windows对GDI调用时对error设置的冲突,可以用预处理器解决,方法是:在右键ceres属性-配置属性-C/C++-预处理器(Preprocessor)-预处理器定义处加上GLOG_NO_ABBREVIATED_SEVERITIES,注意不要把原来这里的定义删掉。
5. 全部生成完成之后,可以\ceres目录下新建Include,Library两个文件夹 
      
头文件
将\ceres\ceres-solvers-1.11.0\include下的文件夹ceres复制到Include下;
将\ceres\ceres-solver build\config\ceres\internal下文件config.h复制到\ceres\Include\ceres\internal中;
将\ceres\glog-master\src\windows下的glog文件夹复制到Include下;
将\ceres\gflags-build\include下的gflags文件夹复制到Include下;
将\ceres\eigen 3下的Eigen文件夹复制到\ceres\Include\ceres下; 

库文件(以32Debug为例)

将\ceres\glog-master\Debug下libglog.dll复制到系统盘\Windows\System32下;
将\ceres\glog-master\Debug下libglog.lib复制到\ceres\Library;
将\ceres\ceres-solver build\32Debug\lib\Debug下的ceres-debug.lib复制到\ceres\Library;
将\ceres\gflags-build\lib\Debug下的gflags_static.lib和gflags_nothreads_static.lib复制到\ceres\Library;
测试与使用

1. helloword

新建一个helloword的工程文件;
将\ceres\ceres-solver-1.11.0\examples中的helloworld.cc文件复制到工程文件中;
设置工程的包含文件:项目 - helloworld属性 - VC++目录 - 包含目录 上添加D:\ceres\Include;
添加附加依赖项:项目 - helloworld属性 - 连接器 - 输入 - 附加依赖项 上添加D:\ceres\Library\ceres-debug.lib和C:\ceres\Library\libglog.lib。
生成项目并开始执行,最终会在命令窗口中看到convergence,收敛,证明成功了

注意:可能会提示缺少libglog.dll文件,那么把生成的libglog.dll文件复制到这个测试文件的Debug文件中,即可执行。
2. circle_fit
同1一样,新建circle_fit项目,项目 - 属性 - VC++目录 - 包含目录,添加D:\ceres\Include;
项目- 属性-链接器-常规 -附加库目录,添加 D:\ceres\lib,
项目- 属性- 链接器 -输入 - 附加依赖性,添加 ceres-debug.lib
libglog.lib
gflags_nothreads_static.lib
gflags_static.lib
然后编译执行即可。
注意,可能会出现错误
错误    4    error LNK2019: 无法解析的外部符号 __imp__PathMatchSpecA@8,该符号在函数 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall google::`anonymous namespace'::CommandLineFlagParser::ProcessOptionsFromStringLocked(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 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
 

解决方法:在项目-属性-链接器-输入中添加 shlwapi.lib
把代码中CERES_GFLAGS_NAMESPACE替换为GFLAGS_NAMESPACE,代码前面添加 using namespace GFLAGS_NAMESPACE;
3. curve_fit
同2一样,复制ceres中的example中的curve_fit.cc,新建项目,添加配置。直接编译,运行,无错误。
--------------------- 
作者:chengwei0019 
来源:CSDN 
原文:https://blog.csdn.net/u012700322/article/details/75321609 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/everagain/article/details/84863480