记录下自己编译ceres-solver走过的弯路,同时希望对其他人能有所帮助。
编译过程主要参考以下两篇博文,但还是存在一些大坑,后面我会着重强调。
http://blog.csdn.net/streamchuanxi/article/details/52944652
http://blog.csdn.net/yizhou2010/article/details/52596280
1. 下载必备库ceres-solver-1.11.0、eigen、gflags-2.0、glog-master
具体下载地址自行上网搜索,下载后解压到文件夹ceres中。
在接下的编译过程中,需要十分注意的是:千万不要做平台的修改,必须在win32/x86下编译,否则即使最后成功也无法使用!!!
2. 编译glog
解压后直接用vs2015打开google-glog.sln,版本问题直接迁移即可。
生成失败主要解决以下两个问题:
问题一:
“错误 C2375 “snprintf”: 重定义”
解决方法:注释掉语句
“//extern int GOOGLE_GLOG_DLL_DECL snprintf(char *str, size_t size,
// const char *format, ...);”
问题二:
“错误 C2084 函数“int snprintf(char *const ,const std::size_t,const char *const ,...)”已有主体”
解决方法:
同样注释掉语句
“//int snprintf(char *str, size_t size, const char *format, ...) {
// va_list ap;
// va_start(ap, format);
// const int r = vsnprintf(str, size, format, ap);
// va_end(ap);
// return r;
//}”
3. 编译gflags
同样用vs2015打开gfalgs.sln(高版本貌似需要用cmake生成工程后再编译)。
主要存在以下几个问题:
问题一:
“错误 C2375 “snprintf”: 重定义;不同的链接 libgflags d:\ceres\gflags-2.0\src\windows\port.h 60”
“错误 C2084 函数“int snprintf(char *const ,const std::size_t,const char *const ,...)”已有主体”
解决方法:同上,注释掉语句
问题二:
“错误 C3688 文本后缀“PRIu64”无效;未找到文文本运算符或文本运算符模板”
解决方法:
将"%"PRId32改为“%d”
将"%"PRId64改为”%I64d“
将"%"PRIu64改为”%I64u“
4. 编译ceres
采用cmake的方式(若不会使用可参照开头给出的链接)
另: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勾上!!!
否则即使最后成功生成在很多情况下也是运行失败的。
Configuring done and generating done.
最后,打开ceres.sln,生成ALL_BUILD,不出意外应该没什么问题。
5. 整理并使用
所需的各种文件已经全部生成,下面进行适当的整理就可以使用了。
在ceres目录下新建include和lib文件夹(便于项目添加)
将以下文件复制到include文件夹:
D:\ceres\ceres-solver-1.11.0\include\ceres
D:\ceres\ceres-solver-1.11.0\config\ceres\internal(复制到D:\ceres\include\ceres\internal文件夹中)
D:\ceres\glog-master\src\windows\glog
D:\ceres\gflags-2.0\src\windows\gflags
D:\ceres\eigen\Eigen
将以下文件复制到lib文件夹:
D:\ceres\glog-master\Debug\libglog.lib
D:\ceres\ceres-solver-1.11.0\mybuild\lib\Debug\ceres-debug.lib
D:\ceres\gflags-2.0\Debug\libgflags-debug.lib
D:\ceres\glog-master\Debug\libglog.dll(复制到C:\Windows\SysWOW64文件夹中)
好了,所有的工作都已经完成了,最后只要在需要用到ceres的项目中添加c++目录和链接器即可。