vs2015+64位win10系统ceres-solver编译

记录下自己编译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:ceresgflags-2.0srcwindowsport.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:cereseigen“ 
GLOG_INCLUDE_DIR为”D:ceresglog-mastersrcwindows“
GLOG_LIBRARY为”D:ceresglog-masterDebuglibglog.lib“
GFLAGS_INCLUDE_DIR为"D:ceresgflags-2.0"
GFLAGS_LIBRARY为"D:ceresgflags-2.0Debuglibgflags-debug.lib"

然后重点来了:

必须要将选项中的EIGENSPARSE勾上!!!

否则即使最后成功生成在很多情况下也是运行失败的。

Configuring done and generating done.

最后,打开ceres.sln,生成ALL_BUILD,不出意外应该没什么问题。

5. 整理并使用

所需的各种文件已经全部生成,下面进行适当的整理就可以使用了。

在ceres目录下新建include和lib文件夹(便于项目添加)

将以下文件复制到include文件夹:

D:ceresceres-solver-1.11.0includeceres

D:ceresceres-solver-1.11.0configceresinternal(复制到D:ceresincludeceresinternal文件夹中)

D:ceresglog-mastersrcwindowsglog

D:ceresgflags-2.0srcwindowsgflags

D:cereseigenEigen

将以下文件复制到lib文件夹:

D:ceresglog-masterDebuglibglog.lib

D:ceresceres-solver-1.11.0mybuildlibDebugceres-debug.lib

D:ceresgflags-2.0Debuglibgflags-debug.lib

D:ceresglog-masterDebuglibglog.dll(复制到C:WindowsSysWOW64文件夹中)

好了,所有的工作都已经完成了,最后只要在需要用到ceres的项目中添加c++目录和链接器即可。

原文地址:https://www.cnblogs.com/ninahu/p/6800660.html