VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统

由于想要做一些优化处理的工作,所以今天花了几个小时编译了一下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
【VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统】Suitesparse用的是 suitesparse-metis-for-windows
我等下会给出下载链接。
1. 文件布局
首先将ceres、gflags、eigen,glog解压放到同一个文件夹中,如D:/ceres;

VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统
文章图片


2. 安装CMAKE,安装随意
3, 编译glags,glog
这里打开glog-master文件夹,找到google-glog.sln,双击打开。可能会存在VS版本不同的问题(这个小问题),加载完以后,直接编译就可以。对应Debug和Release模式,会分别生成链接库。Debug生成结果如下图:
VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统
文章图片


之后编译glags,由于glag里面没有*.sln文件,所以这里需要用Cmake。
进入gflags-master文件夹,在里面新建build_test文件夹,打开cmake,如下图所示,点击第一个browse sourse,设置源码所在位置,点击第二个browse sourse,设置生成文件所在位置,这个位置,会生成一个.sln 文件。


VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统
文章图片


点击configure,之后generate,OK。生成结果如下:
VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统
文章图片


注意:(此部分在2013编译未出现,在2017编译中出现)在生成中可能会出现error C3861: “snprintf”: 找不到标识符
通过查看函数定义,可以发现程序中函数实现部分未启用(如下图),然后写着msvc 2015 already defines,怀疑是VS的版本问题。项目右键属性---常规---windows SDK版本,修改为10.0.15063.0(之前是8.1,),然后重新编译,通过。
VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统
文章图片

同glog一样,用打开,编译。针对debug和release可以分别生成库文件。
4. 编译ceres
利用cmake生成ceres,首先在 D:\ceres\ceres-solver-1.11.0中新建build文件用于存放编译结果,如图:
VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统
文章图片


点击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,收敛,证明成功了
  • VS2013+Ceres编译教程|VS2013+Ceres编译教程 Win7系统
    文章图片

  • 注意:可能会提示缺少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,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


  • 解决方法:在项目-属性-链接器-输入中添加 shlwapi.lib
  • 把代码中CERES_GFLAGS_NAMESPACE替换为GFLAGS_NAMESPACE,代码前面添加 using namespace GFLAGS_NAMESPACE;
  • 3. curve_fit
  • 同2一样,复制ceres中的example中的curve_fit.cc,新建项目,添加配置。直接编译,运行,无错误。
(github地址) https://github.com/jlblancoc/suitesparse-metis-for-windows
相关博客: VS2013+64位win7系统ceres solver编译教程
Ceres-Solver库使用(一)--windows下安装配置
Windows 配置 Ceres-solver
vs2015+64位win10系统ceres-solver编译


    推荐阅读