ceres-solver库编译说明
0、 ceres-solver简介
Ceres Solver是一个C++环境下的非线性最小二乘问题的求解工具包,可用来建模并解决大型复杂的非线性最小二乘问题。这个工具包已经广泛被用于很多商业软件中。在google project里面有它的主页: http://code.google.com/p/ceres-solver/。
在Google,使用 Ceres Solver 来估测街景车、飞机和卫星的姿态;给 PhotoTours 建立 3D 模型;估测卫星图像传感器的特征等。比如:下面这个视频展示了三个实例(Youtube)。
编译ceres-solver需要依赖eigen、gflags和glog三个库,以及编译时需要cmake来生成工程文件[1]。下表为所需的所有的库下载地址:
|
名称 |
下载地址 |
|
ceres-solver |
https://ceres-solver.googlecode.com/files/ceres-solver-1.6.0.tar.gz |
|
eigen |
http://bitbucket.org/eigen/eigen/get/3.2.0.tar.bz2 |
|
gflags |
https://gflags.googlecode.com/files/gflags-2.0-no-svn-files.tar.gz |
|
glog |
https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz |
|
cmake |
http://www.cmake.org/files/v2.8/cmake-2.8.12.1-win32-x86.exe |
将上面五个库和工具下载好,并且安装好cmake。为了方便编译完之后调用,在一个空文件夹中新建两个目录,include和lib,用来存放ceres-solver编译之后的调用库和头文件。
1、 编译gflags
google开源的gflags是一套命令行参数解析工具,比getopt功能更强大,使用起来更加方便,gflags还支持从环境变量、配置文件读取参数(可用gflags代替配置文件)[2]。
首先编译gflags,解压后就有VS的工程文件,双击打开sln工程文件,编译即可。我只编译了Release版本,编译完之后会在sln所在目录生成的Release文件夹,里面就是编译完的dll(libgflags.dll)和lib(libgflags.lib)。
2、 编译glog
glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活,而且功能也比较完善[3]。接下来编译glog,编译glog与编译gflags完全一样。解压后就有VS的工程文件,双击打开sln工程文件,编译即可。我同样也只编译了Release版本,编译完之后会在sln所在目录生成的Release文件夹,里面就是编译完的dll(libglog.dll)和lib(libglog.lib),此外还有一个静态库的lib(libglog_static.lib)。
编译完成之后,将src目录下的windows下面的glog文件夹拷贝到上面新建的include目录,将Release目录下的dll和lib拷贝到上面新建的lib目录。
3、 编译eigen
eigen是一个用于矩阵运算的模板库,不需要编译,只需要将头文件包含即可[4]。为了方便后续使用,我们需要将eigen库的头文件整理下,具体操作是:将解压目录中的Eigen文件夹拷贝到上面新建的include目录,然后将Eigen文件夹中所有的CMakeLists.txt文件删除,不删除也可以,不影响后续使用。
4、 编译ceres-solver
将ceres-solver解压,然后打开camke工具,将ceres-solver-1.6.0的目录和输出目录分别指定进去,如下图所示:
然后点击Configure按钮,弹出选择编译器,这个根据自己电脑安装的编译器来进行选择,我这里选择Visual Studio 9 2008,如下图所示,然后点击Finish,cmake就开始生成工程文件。
接下里会提示配置错误,如下图所示,点击确定后,我们需要手动修改里面一些依赖库的路径等。
根据提示信息,配置完glog和gflags库的include和lib的路径,如下图所示。
然后再根据提示配置eigen库的路径,Name后面带有AMD字样的全都不用管,默认就行了。需要注意的是,由于VS2008不支持TR1库,所以需要把TR1的选项禁用,如下图所示。
完成上面的步骤,再次点击Configue按钮,如果不提示错误,最下面输出Configuring done字样,说明配置OK,否则重复上面的步骤,直至配置成功。配置成功之后点击Generate按钮,生成sln工程文件。
接下来在build目录里面打开sln文件。打开之后发现一共有70个项目,如果你想全部编译的话,直接在ALL_BUILD工程上右键编译即可。为了节省时间,我只选择编译ceres工程。这个工程编译的结果是一个静态库,也就是我们后续要用的。如果编译过程中提示头文件不能打开,请回到上面的cmake,重新配置相关库的路径。
我在编译ceres-solver-1.6库的时候,提示lower_bound找不到标识符,在文件compressed_col_sparse_matrix_utils.cc开头,添加#include <algorithm>,然后重新编译即可。然后将Release版本也编译下。整个编译时间大致需要5分钟。
编译完成之后,将编译生成的ceres.lib文件重命名为ceres_d.lib(DEBUG版本)和ceres_r.lib(RELEASE版本),然后将两个lib文件拷贝到上面创建的lib文件夹中。将ceres-solver-1.6库中的include目录下的ceres文件夹拷贝到我们之前创建的include目录。
至此,一个ceres-solver的二次开发库就编译完成,以后我们只需要上面的include和lib目录就可以进行调用了。至于为什么ceres-solver需要将debug和release的库同时保留,是因为在编写程序时,debug版本必须调用ceres-solver的debug,release版本必须调用ceres-solver的release版本,否则程序会直接崩溃,所以两个版本都保留。重命名是为了能够在一个lib文件夹中同时存放两个版本的lib。
最终的目录结构如下图所示。
5、 参考资料:
[1] http://www.grandmaster.nu/blog/?page_id=628
[2] http://blog.chinaunix.net/uid-20196318-id-3440642.html
[3] http://www.cnblogs.com/foreveryl/archive/2011/10/14/2212265.html
[4] http://blog.csdn.net/abcjennifer/article/details/7781936
ceres-solver库编译说明的更多相关文章
- Ceres Solver: 高效的非线性优化库(一)
Ceres Solver: 高效的非线性优化库(一) 注:本文基于Ceres官方文档,大部分由英文翻译而来.可作为非官方参考文档. 简介 Ceres,原意是谷神星,是发现不久的一颗轨道在木星和火星之间 ...
- VINS(九)Ceres Solver优化(未完待续)
使用Ceres Solver库处理后端优化问题,首先系统的优化函数为
- Ceres Solver: 高效的非线性优化库(二)实战篇
Ceres Solver: 高效的非线性优化库(二)实战篇 接上篇: Ceres Solver: 高效的非线性优化库(一) 如何求导 Ceres Solver提供了一种自动求导的方案,上一篇我们已经看 ...
- Ceres Solver for android
最近开发中,需要对图片做一些处理与线性技术,这时就用到了Ceres Solver.如何把Ceres Solver集成到Android里呢? 官网给了一个解决方案,简洁明了: Downloa ...
- 将STM32的标准库编译成lib使用【图文】
以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间.每次建立工程都这么编译,是一个相当浪费时 ...
- 将STM32的标准库编译成lib
转载自:http://www.cnblogs.com/zyqgold/p/3189719.html 以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这 ...
- iOS之 PJSIP静态库编译(三)
dada哪个所有静态库编译完成后还是不能运行那个demo,提示你找不到arm**.a 你lipo后要记得吧合并成.a 名字更改成你最后编译版本生成的.a名字....... 或者吧所有库add到你的工 ...
- iOS之 PJSIP静态库编译(一)
首先放上pjsip官方网站http://www.pjsip.org/download.htm 下载的时候注意while the .bz2 has LF line-ends and is for Uni ...
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
随机推荐
- 基于Java配置Spring加Hibernate和再加SpringData时的差别
先在类路径application.properties jdbc.driverClassName = org.postgresql.Driver jdbc.url = jdbc:postgresql: ...
- 【java集合系列】---HashSet
在前面的博文中,小编主要简单介绍了java集合中的总体框架,以及list接口中典型的集合ArrayList和LinkedList,接着,我们来看set的部分集合,set集合和数学意义上的集合没有差别, ...
- Linux Shell编程参考大全
本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...
- ajax中xmlhttp.readyState和xmlhttp.status的值及解释
xmlhttp.readyState的值及解释: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...
- XListView下拉刷新和上拉加载更多详解
转载本专栏每一篇博客请注明转载出处地址,尊重原创.博客链接地址:小杨的博客 http://blog.csdn.net/qq_32059827/article/details/53167655 市面上有 ...
- python 3.3.3 字面量,正则,反斜杠和原始字符串
两个不起眼但是比较重要的设定 Python str类型的字面量解释器 当反斜杠及其紧接字符无法构成一个具有特殊含义的序列('recognized escape sequences')时,Python选 ...
- C++ 虚函数表 多重继承
上次研究的是单继承的情况,这次研究多重继承下的虚函数表的排列情况. 这次A,A1,A2,B这几个类的继承关系如下图: 测试代码如下: #include<iostream> using na ...
- 小小聊天室 Python实现
相对于Java方式的聊天室,Python同样可以做得到.而且可以做的更加的优雅.想必少了那么多的各种流的Python Socket,你一定会喜欢的. 至于知识点相关的内容,这里就不多说了. UDP方式 ...
- (一二九)获取文件的MineType、利用SSZipArchive进行压缩解压
MineType 简介 文件在网络上以二进制流的方式传播,为了区分不同的文件类型,用MineType来标明. 为什么要获取 文件的拓展名较短,比较好记,但是MineType是很长的,比如docx拓展名 ...
- 指令汇C电子市场开发(一) ActionBar的使用
前话: 在学习开发谷歌电子市场的的时候,我换了一款比较高大上的模拟器--genymotion,首先去genymotion的官网注册下载,然后安装.感觉这款模拟器运行挺快的,哈哈,而且可以直接把应用拖进 ...