記錄下自己編譯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++目錄和鏈接器即可。
