Windows编译gtsam

8 篇文章 0 订阅
8 篇文章 0 订阅

1. 目的

  • 为了同时使用ceres,g2o,gtsam完成优化问题的求解。并探求不同的优化库分别针对什么问题进行求解是比较合适的。
  • 平时工作环境又是Windows故尝试在Windows平台完成编译。现在在vs2017之后都可以通过微软官方的vcpkg直接得到特定版本的库了,需要自取。

2. Cmake 结果

Use System Eigen : ON (Using version: 3.3.4)
Use Intel TBB : Yes
Eigen will use MKL : MKL not found
Eigen will use MKL and OpenMP : OpenMP found but GTSAM_WITH_EIGEN_MKL is disabled
Default allocator : TBB
Cheirality exceptions enabled : YES
Packaging flags
CPack Source Generator : TGZ
CPack Generator : TGZ
GTSAM flags 
Quaternions as default Rot3 : Enabled
Runtime consistency checking : Disabled
Rot3 retract is full ExpMap : Enabled
Pose3 retract is full ExpMap : Enabled
Allow features deprecated in GTSAM 4.1 : Enabled
Metis-based Nested Dissection : Enabled
Use tangent-space preintegration : Enabled
MATLAB toolbox flags
Install MATLAB toolbox : Disabled
Python toolbox flags 
Build Python module with pybind : Disabled
===============================================================
Configuring done
Generating done

2. 源码下载

下载当时最新版,选择4.1rc版本,Windows 继续采用cmake进行编译管理。一切照旧操作。

3. 编译过程&解决方案

Configuration配置选择系统自带 E i g e n Eigen Eigen t b b tbb tbb加速,动态库,无 p y t h o n python python,使用四元数,剩下的都几乎是默认参数。如Figure 3.1所示:
请添加图片描述

Figure3.1 Cmake配置选项
然后开始配置,接下来介绍出现的问题以及对应的解决方案:

问题1:Cmake过程中Boost无法找到;
解决方案: 根据文章得知,find_package会去CMAKE_MODULE_PATH 中查找Findxxx.cmake 文件,然后在这个文件提供的路径下去寻找相应的库,那么通过想cmakelist文件中添加message("cmake_module_path: " ${CMAKE_MODULE_PATH})得知,会在源码目录cmake中的FindBoost.cmake中查找对应的boost路径,如下Figure 3.2通过在该cmake文件中查询发现find boost会使用下面两个变量:Boost_INCLUDE_DIR,BOOST_LIBRARYDIR。于是将

set(Boost_INCLUDE_DIR "D:/ThirdPartyLibraries-20210530/include")
set(BOOST_LIBRARYDIR "D:/ThirdPartyLibraries-20210530/x64/vc15/lib/Debug")

设置在find的前面,然后重新configuration,发现boost可以找到了。
问题2:TBB无法找到,原因同上,解决方案也同上 。
添加如下变量于tbb的find_pachage前面

set(TBB_INCLUDE_DIRS "D:/ThirdPartyLibraries-20210530/include")
set(TBB_LIBRARIES "D:/ThirdPartyLibraries-20210530/x64/vc15/lib/Debug")

于是configuration也通过了。
请添加图片描述

Figure 3.2 cmake路径中的.cmake文件

因为事先已经将其他库文件分类成Release和Debug版本的,因此这里先编译的Release版本的,后编译Debug版本的,发现只需要修改CMakeLists中的路径就可以得到不同版本的库文件,都不需要重新修改cmake的。
请添加图片描述
随后generate也顺利通过,但是在打开vs进行批量生成的时候,报错无法解析的外部依赖项和链接失败的问题。
问题3:LINK : fatal error LNK1181: 无法打开输入文件“tbb-NOTFOUND.obj”
原因: 是附加依赖项中出现tbb-NOTFOUND,tbbmalloc-NOTFOUND,github上搜索发现是gtsam中关于tbb的问题#issue240,默认只能识别 静态库,因此需要在CmakeList.txt中修改将 gtsam\cmake\FindTBB.cmake 中用
add_library(\${libname} SHARED IMPORTED)
替换掉
add_library(${libname} STATIC IMPORTED)
然后release下的这个错误就没有了,但是debug下还是依赖的release的,重新cmake也不行,最后选择手动将debug下的关于tbb的附加依赖库都改了,之后就没有问题了,但是更加自动化批量修改的方式后面还需要进一步研究。
问题:无法解析的外部依赖项, LNK2019 无法解析的外部符号 “public: __cdecl gtsam::ShonanAveraging3::ShonanAveraging3(class std::basic_string<char,struct std::char_traits,class std::allocator >,struct gtsam::ShonanAveragingParameters<3> const &)” (??0ShonanAveraging3@gtsam@@QEAA@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBU?$ShonanAveragingParameters@$02@1@@Z),该符号在函数 main 中被引用 ShonanAveragingCLI
解决方案
将附加依赖项中的tbb部分手动替换成如下项:

D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\tbb_debug.lib
D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\tbbmalloc_debug.lib

其他大部分的example中的附加依赖库都是一样的,下面这5个除外。之后编译成功。
请添加图片描述

Figure 3.3 附加依赖项不一致的example工程

附:添加的附加依赖项,Debug模式才需要,如下仅为个人记录,需要时修改对应路径才能用。

..\..\lib\Debug\gtsam_unstableDebug.lib;..\..\lib\Debug\gtsamDebug.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_program_options-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_serialization-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_filesystem-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_thread-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_atomic-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_date_time-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_regex-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_timer-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_chrono-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\libboost_system-vc141-mt-gd-1_64.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\tbb_debug.lib;D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\tbbmalloc_debug.lib;..\..\lib\Debug\metis-gtsamDebug.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib

其他Ref

  • tbbmalloc找不到的错误,详见
  • Find_package和include_directories之间的关系,详见
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值