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
下载当时最新版,选择4.1rc版本,Windows 继续采用cmake进行编译管理。一切照旧操作。
Configuration配置选择系统自带 E i g e n Eigen Eigen, t b b tbb tbb加速,动态库,无 p y t h o n python python,使用四元数,剩下的都几乎是默认参数。如Figure 3.1所示:
问题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")
因为事先已经将其他库文件分类成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
解决方案:
将附加依赖项中的tbb部分手动替换成如下项:
D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\tbb_debug.lib
D:\ThirdPartyLibraries-20210530\x64\vc15\lib\Debug\tbbmalloc_debug.lib
其他大部分的example中的附加依赖库都是一样的,下面这5个除外。之后编译成功。
附:添加的附加依赖项,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