最近在编译《视觉SLAM十四讲》ch13章节的代码。由于原来笔记本T430安装的Ubuntu16系统。这次从安装Ubuntu20到最终实现教材中的例子,跑通KITTI的数据集,耗时3天,中间也出现过很多踩坑的环节,也多亏csdn上很多无私的博主分享的内容,最后还是完成了编译实现。所以,拒绝白嫖,从现在做起。后面应该还有想做的小伙伴,趁着还熟悉,花时间记录一下踩过的坑,希望能帮助到有需要的人。
提前透露一下,这次主要费时的工作是三个:1、ros-noetic的rosdep update和sudo rosdep init;2、Sophus的报错与更新;3、Egien库的安装、删除与解决undefined reference to错误。
先插入最后的成功界面,大家耐心点,都能实现。
这里没有太大的难度。官网或者其他博客也都说的很清楚。不过需要注意的是很多人都是用虚拟机或者双系统的安装,我担心有库不兼容。反正t430配置也低了,win10也带不起来,直接把原来的Ubuntu16全盘格式化以后,安装的单机版的Ubuntu20.04。
有需要的小伙伴可以从这里下载20.04或者更高的版本[https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso];
然后使用UltralSO工具制作U盘启动,(https://www.ultraiso.com/)官网可以下载,制作过程和方法可以参考[https://product.pconline.com.cn/itbk/software/dnwt/1512/7331473.html],图文说明。
制作好U盘启动盘,插上U盘,在你的电脑上按下对应的BIOS键(t430开机F12,可以进入到U盘启动)。
Ubuntu 20.04安装过程可以参考网址https://blog.csdn.net/baidu_35805755/article/details/121324169
最好安装成全英文版,分区的话我也没设置,双系统或者虚拟机应该需要设置。
官网有比较详细的安装方法:链接是这个[https://wiki.ros.org/noetic/Installation/Ubuntu],也可以参考知乎或者其它的安装讲解。
如果做计算机视觉的时候,不需要ROS,这一段可以跳过,直接到(三)。
在此之前,请打开软件更新,选择国内的下载服务器。Software&Updates–Setting—Ubuntu Software—Download from—点击右侧下拉△——Other—选择国内的mirror.tinghua.com/ubuntu或者mirr.aliyun.com/ubuntu,这是选择下载源,保证在线下载能够顺利完成,huawei的应该也可以。
打开终端,依次执行以下操作,更改下载源:
## (1)添加sources.list
> sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
## (2)添加 keys
> sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
##(3)确保Debian软件包索引是当前最新的
> sudo apt update
## (4)安装完全版的ros-noetic
> sudo apt install ros-noetic-desktop-full
## (5)安装必要的package包
> sudo apt install ros-noetic-PACKAGE
## (6)设置环境变量,在每一个bash终端添加source
> source /opt/ros/noetic/setup.bash
## (7)安装building packages的依赖
> sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
## (8)安装rosdep
> sudo apt install python3-rosdep
## (9)rosdep初始化你的ROS
> sudo rosdep init
> rosdep update
在安装ros的过程中,前面(1)-(8)安装应该都没有什么问题,但是(9)初始化rosdep的过程,由于raw.githubusercontent.com域名禁止访问,导致无法更新链接。大家可以在网上查找资料,大部分都是在文件中添加中转网址,方法是是终端操作:
> sudo gedit /etc/hosts
151.101.84.133 raw.githubusercontent.com
185.199.108.133 raw.githubusercontent.com
185.199.109.133 raw.githubusercontent.com
185.199.110.133 raw.githubusercontent.com
185.199.111.133 raw.githubusercontent.com等等。在hosts文件的最后加上这些,目的就是能够通过中转,链接到对应网址。还有的是通过学校内网,在半夜用网非高峰时期操作(捂眼),应该可以用,但是我始终没有操作成功。
不过在强大的csdn上,还是发现了大神,链接是这个:[https://blog.csdn.net/weixin_53660567/article/details/120607176#comments_18709733]。
> sudo pip install rosdepc
## 如果显示没有pip可以试试
> sudo pip3 install rosdepc
## 如果pip3还没有:
> sudo apt-get install python3-pip
> sudo pip install rosdepc
## 安装(最后居然还显示了博主的flag)
> sudo rosdepc init
> rosdepc update
## 成功 测试方法,终端打开
> roscore
## 新的终端打开,调出小海龟
> rosrun turtlesim turtlesim_node
## 第三个终端打开。操作键盘时把鼠标指针放到第三个终端上,小乌龟可以运动。
> rosrun turtlesim turtle_teleop_key
## 如果小海龟可以运动,说明安装成功了。
大家如果没有接触过本教材,可以先从基础知识开始,花点时间积累积累。我这里就先从后面实践开始,原网址https://github.com/gaoxiang12/slambook2可以下载所有的代码和第三方库。
我在csdn上找到三个网址,别的博主已经实现的过程,非常具有借鉴意义,在此先放一下链接:
(1)视觉SLAM十四讲–第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤):https://blog.csdn.net/jiachang98/article/details/121700288;
(2)视觉slam十四讲中ch13设计slam系统的编译运行:https://blog.csdn.net/ldk3679/article/details/105816907;
(3)视觉SLAM十四讲slambook2示例代码所有依赖库的编译安装教程(VTK、OpenCV3、ceres、Sophus、g2o、Eigen、Pangolin、googletest等):https://blog.csdn.net/weixin_44120025/article/details/122244849
**(1)Eigen 安装方法
Eigen 开源的C++线性代数库,提供几何模块。在视觉SLAM教材中,有直接的安装方法,不过对于前面几个章节可能是没问题的,ch13章节的依赖很多,低版本的eigen会出现问题。所以借鉴博主:Sophus库安装踩坑(SLAM十四讲):https://blog.csdn.net/weixin_44684139/article/details/104803225有比较详细的安装方法。建议:直接用高版本的3.3.8版本安装。
正确方法:
(1)在官网(http://eigen.tuxfamily.org/index.php?title=Main_Page)下载安装包:eigen-3.3.8.tar.bz2 ,然后提取到此处
(2)进入文件夹eigen-3.3.8,右键在终端打开。
mkdir build
cd build
cmake ..
sudo make install
## 注意,千万不要使用 sudo apt-get install libeigen3-dev 因为这个命令下载的是3.2版本的eigen,从而无法与模板类的sophus相匹配
**(2)Sophus安装方法
Sophus,提供对于李代数的支持,是Strasdat维护的SO(3)和SE(3),直接基于Eigen基础上开发的。可以直接从GitHub上下载,只需编译,无须安装。(方法:新建build文件夹,在当前文件夹中,先cmake …,再make)。
借鉴博主:Sophus库安装踩坑(SLAM十四讲):https://blog.csdn.net/weixin_44684139/article/details/104803225有比较详细的安装方法。
① sophus需要依赖fmt库,因此优先安装fmt:
git clone https://github.com/fmtlib/fmt.git
cd fmt
mkdir build
cd build
cmake ..
make
sudo make install
② 安装Sophus
直接把文件下载到/Downloads下,解压,新建build文件夹,cmake … 和make 编译,最后安装sudo make install.
git clone https://github.com/strasdat/Sophus.git
cd Sophus/
mkdir build
cd build
cmake ..
make
sudo make install
比较典型的时Eigen3没有安装到/usr/include中,而是安到/usr/local/include/Eigen3中,这时候需要进行映射,将安装目录中的文件映射到编译的地址中/usr/include:
命令如下:
> sudo ln -s /usr/local/include/eigen3/Eigen /usr/include/Eigen
##(安装目录 映射目录)
Eigen问题解决:eigen_assert_exception’ is not a member of ‘Eigen’具体可以参考下面的网址:修改代码。
参考方法和网址:Eigen问题解决:eigen_assert_exception’ is not a member of ‘Eigen’ https://blog.csdn.net/qq_25458977/article/details/115319819
安装会出现的问题,主要还是参考网上的解决方法:
(1)正确安装sophus,需要首先安装高版本的Eigen,这里可以下载3.8.8版本以上,参考下列网址:
https://blog.csdn.net/weixin_44684139/article/details/104803225https://blog.csdn.net/weixin_44684139/article/details/104803225
(2)其次安装fmt8.1.1版本,低版本的安装后,会导致Sophus在make编译时报错;下载最新版本网址为:https://fmt.dev/8.1.1/ 安装方法同样参考上述网址;
(3)下载sophus,从https://github.com/strasdat/Sophus.githttps://github.com/strasdat/Sophus.git网址,安装方法新建build文件夹,之后在build中cmake …,然后编译make,最后安装sudo make install;安装方法同样参考上述网址;https://blog.csdn.net/weixin_44684139/article/details/104803225。
原因:没有链接fmt库。
解决方法:在/ch13/test/文件夹中的CmakeList.txt中,增加fmt,如下所示:
SET(TEST_SOURCES test_triangulation)
FOREACH (test_src ${TEST_SOURCES})
ADD_EXECUTABLE(${test_src} ${test_src}.cpp)
# TARGET_LINK_LIBRARIES(${test_src} ${THIRD_PARTY_LIBS} myslam)
#----在上面这一行中,最后加入fmt-----
TARGET_LINK_LIBRARIES(${test_src} ${THIRD_PARTY_LIBS} myslam fmt)
#-----链接到fmt库----
ADD_TEST(${test_src} ${test_src})
ENDFOREACH (test_src)
安装OpenCV,OpenCV提供了大量的开源图像优化算法,是计算机视觉中用途非常广泛的图像算法处理数据库。在Ubuntu中,一般情况下利用源代码安装或者只安装库文件。我在调试的过程中,这个没有报错,所以就按照以下这个进行了安装:
安装Opencv 3.4.15 ubuntu20.04环境下安装opencv教程及测试: https://blog.csdn.net/pink_lemon/article/details/120632557
对于SLAM来说的依赖
原来的依赖:
sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev lijpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev
针对ubuntu20 更新后的依赖:
sudo apt-get install build-essential libgtk2.0-dev libvtk7-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev libtbb-dev
如果上述依赖安装失败,请参考https://blog.csdn.net/weixin_44120025/article/details/122244849
该参考网址有环境变量的配置操作过程 https://blog.csdn.net/weixin_44120025/article/details/122244849
安装方法可以参考视觉SLAM十四讲–第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤)https://blog.csdn.net/jiachang98/article/details/121700288,这个图也是引用的博客里面的图,在此特别说明。侵删。
比如gtest的安装方法,在googletest目录下,打开一个终端,依次执行:
mkdir build # 创建build目录
cd build # 进入build目录
cmake .. # 生成makefile
make -j8 # 进行编译
sudo make install # 安装
安装Pangolin,支持3D绘图的程序库,支持3D绘图;SLAM 教材;
https://github.com/stevenlovegrove/Pangolin/
mkdir build # 创建build目录
cd build # 进入build目录
cmake .. # 生成makefile
make -j8 # 进行编译
sudo make install # 安装
G2O,SLAM研究领域使用的优化库,是一个基础图优化的库,将非线性优化与图论结合的理论,General Graphic Optimization G2O。可以使用官网的g2o,也可以使用高翔代码中的源文件。
cd g2o
mkdir build
cd build
cmake..
make
sudo make install
G2O报错是我这次调试编译最耗时的地方,在CSDN上搜索了很久,修改后,总感觉自己要解决问题了,但是还是出现报错,真的快崩溃了。最后在谷歌上找到了解决方法,虽然答案比较简单,但是过程还是很难受的。
这个问题的最终解决方法是在这个网址找到的:Programming VIP,不仅介绍了什么是G2O,而且还详细给出了调试和使用G2O库的算例方法。www.programming.vip/docs/621909291ab8f.html
error: undefined reference to `g2o::OptimizableGraph::addVertex(g2o::OptimizableGraph::Vertex:clone() const*)’
error: undefined reference to `g2o::OptimizableGraph::Edge(g2o::OptimizableGraph::Edge:clone() const*)’
解决方法:在/slambook2/ch13/app中的CMakeList.txt文件中,修改代码如下:
add_executable(run_kitti_stereo run_kitti_stereo.cpp)
target_link_libraries(run_kitti_stereo myslam ${OpenCV_LIBS})
###-------原来的链接库的代码----------#
#target_link_libraries(run_kitti_stereo myslam)
#----------------------------------#
#--------新修改的的,把g2o的库和子类都添加进去,很多g2o的错误大都由这种引起的,其他问
#题,#大家可以对比解决-------------------------------#
target_link_libraries(run_kitti_stereo myslam g2o_core g2o_types_slam3d g2o_solver_csparse g2o_stuff g2o_csparse_extension)
#------------------------------------------------#
target_link_libraries(run_kitti_stereo myslam ${THIRD_PARTY_LIBS})
网上也有博主总结的g2o的大坑,主要有以下几个(作为大自然的搬运工,侵删)
① g2o 编译问题 https://blog.csdn.net/yangziluomu/article/details/72622225?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-1-72622225-blog-88698502.pc_relevant_blogantidownloadv1&spm=1001.2101.3001.4242.2&utm_relevant_index=4
② g2o库出现undefined reference to错误 https://blog.csdn.net/weixin_44678052/article/details/104579595
③ 视觉SLAM 调试记录 https://wenku.baidu.com/view/f2f4dbb5d9ef5ef7ba0d4a7302768e9951e76e7c.html
该库与g2o同属于C++的优化库,是一个广泛使用的最小二乘问题求解库。在Ceres中,我们只需要按照一定的步骤定义待解的优化问题。然后交给求解器就可以了。
在Ceres目录下打开终端。官网下载https://github.com/ceres-solver/ceres-solver
具体安装过程可以参考 ubuntu 20.04 安装 ceres库: https://blog.csdn.net/qq_39607707/article/details/123736439
① 首先安装依赖:
sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev`
② 然后依次执行如下命令进行编译安装:
git clone https://github.com/ceres-solver/ceres-solver
mkdir build # 创建build目录
cd build # 进入build目录
cmake .. # 生成makefile
make -j8 # 进行编译
sudo make install 安装
注意:
安装过程中有可能cmake的时候会报错,这时候需要安装gtest,gflag,glog等库,可以使用命令行安装,也可以使用源码编译安装。参考3.安装googletest/gflags/glog等方法。
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `Sophus::SO3Base<Sophus::SO3<double, 0> >::normalize() [clone .part.0]':
test_triangulation.cpp:(.text+0x120): undefined reference to `fmt::v8::vprint(fmt::v8::basic_string_view<char>, fmt::v8::basic_format_args<fmt::v8::basic_format_context<fmt::v8::appender, char> >)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> >::make_arg_ref(fmt::v8::basic_string_view<char>) [clone .isra.0] [clone .part.0]':
test_triangulation.cpp:(.text+0x14a): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `MyslamTest_Triangulation_Test::TestBody()':
test_triangulation.cpp:(.text+0x5515): undefined reference to `fmt::v8::vprint(fmt::v8::basic_string_view<char>, fmt::v8::basic_format_args<fmt::v8::basic_format_context<fmt::v8::appender, char> >)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `void fmt::v8::detail::for_each_codepoint<fmt::v8::detail::compute_width(fmt::v8::basic_string_view<char>)::count_code_points>(fmt::v8::basic_string_view<char>, fmt::v8::detail::compute_width(fmt::v8::basic_string_view<char>)::count_code_points)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail18for_each_codepointIZNS1_13compute_widthENS0_17basic_string_viewIcEEE17count_code_pointsEEvS4_T_[_ZN3fmt2v86detail18for_each_codepointIZNS1_13compute_widthENS0_17basic_string_viewIcEEE17count_code_pointsEEvS4_T_]+0x5a4): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::parse_align<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x104): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x11c): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x128): undefined reference to `fmt::v8::detail::throw_format_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x140): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `int fmt::v8::detail::parse_nonnegative_int<char>(char const*&, char const*, int)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail21parse_nonnegative_intIcEEiRPKT_S5_i[_ZN3fmt2v86detail21parse_nonnegative_intIcEEiRPKT_S5_i]+0x9c): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::do_parse_arg_id<char, fmt::v8::detail::parse_replacement_field<char, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&>(char const*, char const*, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&)::id_adapter&>(char const*, char const*, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_]+0xea): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_]+0x10c): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_]+0x12c): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_]+0x138): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_]+0x144): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_]+0x15c): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS6_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SF_SF_OT0_E10id_adapterEESF_SF_SF_SH_]+0x168): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::parse_replacement_field<char, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&>(char const*, char const*, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_[_ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_]+0xeb): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_[_ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_]+0x10d): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_[_ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_]+0x11c): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_[_ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_]+0x130): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o:test_triangulation.cpp:(.text._ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_[_ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_]+0x13f): more undefined references to `fmt::v8::detail::error_handler::on_error(char const*)' follow
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::parse_replacement_field<char, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&>(char const*, char const*, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_[_ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_]+0x157): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `void fmt::v8::detail::check_format_string<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Sophus::SO3Base<Sophus::SO3<double, 0> >::normalize()::{lambda()#1}::operator()() const::FMT_COMPILE_STRING, 0>(Sophus::SO3Base<Sophus::SO3<double, 0> >::normalize()::{lambda()#1}::operator()() const::FMT_COMPILE_STRING)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_[_ZN3fmt2v86detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_]+0x12b): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::parse_align<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x104): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x11c): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x128): undefined reference to `fmt::v8::detail::throw_format_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x140): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::do_parse_arg_id<char, fmt::v8::detail::parse_width<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&)::width_adapter&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0x150): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0x168): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0x174): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0x18c): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0x19d): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::parse_width<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0xe4): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x137): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x147): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x156): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x165): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::do_parse_arg_id<char, fmt::v8::detail::parse_precision<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&)::precision_adapter&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x150): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x168): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x174): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x18c): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x19d): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::parse_precision<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::detail::compile_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x13c): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x14c): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x161): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x170): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o:test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS1_21compile_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x17f): more undefined references to `fmt::v8::detail::error_handler::on_error(char const*)' follow
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::do_parse_arg_id<char, fmt::v8::detail::parse_width<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&)::width_adapter&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0x158): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0x170): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0x181): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::parse_width<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0xe4): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x131): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x141): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x150): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::do_parse_arg_id<char, fmt::v8::detail::parse_precision<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&)::precision_adapter&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x140): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x158): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x170): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0x181): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `char const* fmt::v8::detail::parse_precision<char, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&>(char const*, char const*, fmt::v8::detail::specs_checker<fmt::v8::detail::dynamic_specs_handler<fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler> > >&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x13c): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x14c): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x161): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x170): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o:test_triangulation.cpp:(.text._ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x180): more undefined references to `fmt::v8::detail::error_handler::on_error(char const*)' follow
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `void fmt::v8::detail::buffer<char>::append<char>(char const*, char const*)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail6bufferIcE6appendIcEEvPKT_S7_[_ZN3fmt2v86detail6bufferIcE6appendIcEEvPKT_S7_]+0x1cd): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `fmt::v8::appender fmt::v8::detail::write<char, fmt::v8::appender>(fmt::v8::appender, fmt::v8::basic_string_view<char>, fmt::v8::basic_format_specs<char> const&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail5writeIcNS0_8appenderEEET0_S4_NS0_17basic_string_viewIT_EERKNS0_18basic_format_specsIS6_EE[_ZN3fmt2v86detail5writeIcNS0_8appenderEEET0_S4_NS0_17basic_string_viewIT_EERKNS0_18basic_format_specsIS6_EE]+0x12e): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `fmt::v8::appender fmt::v8::detail::fallback_formatter<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, char, void>::format<fmt::v8::appender>(Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > const&, fmt::v8::basic_format_context<fmt::v8::appender, char>&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail18fallback_formatterIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEcvE6formatINS0_8appenderEEET_RKS7_RNS0_20basic_format_contextISB_cEE[_ZN3fmt2v86detail18fallback_formatterIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEcvE6formatINS0_8appenderEEET_RKS7_RNS0_20basic_format_contextISB_cEE]+0x1b6): undefined reference to `std::locale fmt::v8::detail::locale_ref::get<std::locale>() const'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail18fallback_formatterIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEcvE6formatINS0_8appenderEEET_RKS7_RNS0_20basic_format_contextISB_cEE[_ZN3fmt2v86detail18fallback_formatterIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEcvE6formatINS0_8appenderEEET_RKS7_RNS0_20basic_format_contextISB_cEE]+0xa78): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail18fallback_formatterIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEcvE6formatINS0_8appenderEEET_RKS7_RNS0_20basic_format_contextISB_cEE[_ZN3fmt2v86detail18fallback_formatterIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEcvE6formatINS0_8appenderEEET_RKS7_RNS0_20basic_format_contextISB_cEE]+0xa90): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail18fallback_formatterIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEcvE6formatINS0_8appenderEEET_RKS7_RNS0_20basic_format_contextISB_cEE[_ZN3fmt2v86detail18fallback_formatterIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEcvE6formatINS0_8appenderEEET_RKS7_RNS0_20basic_format_contextISB_cEE]+0xaa3): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/test_triangulation.dir/test_triangulation.cpp.o: in function `void fmt::v8::detail::value<fmt::v8::basic_format_context<fmt::v8::appender, char> >::format_custom_arg<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, fmt::v8::detail::fallback_formatter<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, char, void> >(void*, fmt::v8::basic_format_parse_context<char, fmt::v8::detail::error_handler>&, fmt::v8::basic_format_context<fmt::v8::appender, char>&)':
test_triangulation.cpp:(.text._ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_[_ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_]+0x3b5): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_[_ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_]+0x3fb): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_[_ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_]+0x413): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_[_ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_]+0x429): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_[_ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_]+0x43a): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: test_triangulation.cpp:(.text._ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_[_ZN3fmt2v86detail5valueINS0_20basic_format_contextINS0_8appenderEcEEE17format_custom_argIN5Eigen9TransposeINS8_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISC_cvEEEEvPvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS5_]+0x457): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
collect2: error: ld returned 1 exit status
make[2]: *** [test/CMakeFiles/test_triangulation.dir/build.make:134: ../bin/test_triangulation] Error 1
make[1]: *** [CMakeFiles/Makefile2:163: test/CMakeFiles/test_triangulation.dir/all] Error 2
make: *** [Makefile:95: all] Error 2
解决方法:
报错的文件对应的程序源文件时test_triangulation.cpp,这个文件在test文件夹中,参考网址https://wenku.baidu.com/view/f2f4dbb5d9ef5ef7ba0d4a7302768e9951e76e7c.html
给出的解决方法,问题时程序没有执行链接到fmt的动态链接文件,方法时将test文件夹下Cmakelist.txt编译文件下的
TARGET_LINK_LIBRARIES(${test_src} ${THIRD_PARTY_LIBS} myslam)
,修改为
ARGET_LINK_LIBRARIES(${test_src} ${THIRD_PARTY_LIBS} myslam fmt)
,增加fmt。
这样make编译以后,错误解决。
In file included from /usr/local/include/g2o/core/base_unary_edge.h:30,
from /home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp:8:
/usr/local/include/g2o/core/base_fixed_sized_edge.h:179:32: error: ‘index_sequence’ is not a member of ‘std’
179 | struct HessianTupleType<std::index_sequence<Ints...>> {
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:179:32: error: ‘index_sequence’ is not a member of ‘std’
/usr/local/include/g2o/core/base_fixed_sized_edge.h:179:51: error: expected parameter pack before ‘...’
179 | struct HessianTupleType<std::index_sequence<Ints...>> {
| ^~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:179:51: error: template argument 1 is invalid
/usr/local/include/g2o/core/base_fixed_sized_edge.h:179:54: error: expected unqualified-id before ‘>’ token
179 | struct HessianTupleType<std::index_sequence<Ints...>> {
| ^~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:186:38: error: ‘make_index_sequence’ is not a member of ‘std’
186 | typename HessianTupleType<std::make_index_sequence<_nr_of_vertex_pairs>>::type;
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:186:38: error: ‘make_index_sequence’ is not a member of ‘std’
/usr/local/include/g2o/core/base_fixed_sized_edge.h:186:58: error: template argument 1 is invalid
186 | typename HessianTupleType<std::make_index_sequence<_nr_of_vertex_pairs>>::type;
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:186:16: error: expected nested-name-specifier
186 | typename HessianTupleType<std::make_index_sequence<_nr_of_vertex_pairs>>::type;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:188:38: error: ‘make_index_sequence’ is not a member of ‘std’
188 | typename HessianTupleType<std::make_index_sequence<_nr_of_vertex_pairs>>::typeTransposed;
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:188:38: error: ‘make_index_sequence’ is not a member of ‘std’
/usr/local/include/g2o/core/base_fixed_sized_edge.h:188:58: error: template argument 1 is invalid
188 | typename HessianTupleType<std::make_index_sequence<_nr_of_vertex_pairs>>::typeTransposed;
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:188:16: error: expected nested-name-specifier
188 | typename HessianTupleType<std::make_index_sequence<_nr_of_vertex_pairs>>::typeTransposed;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:208:32: error: ‘std::index_sequence’ has not been declared
208 | bool allVerticesFixedNs(std::index_sequence<Ints...>) const;
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:208:46: error: expected ‘,’ or ‘...’ before ‘<’ token
208 | bool allVerticesFixedNs(std::index_sequence<Ints...>) const;
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.h:213:75: error: ‘std::index_sequence’ has not been declared
213 | izeOplus_allocate(JacobianWorkspace& jacobianWorkspace, std::index_sequence<Ints...>);
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:213:89: error: expected ‘,’ or ‘...’ before ‘<’ token
213 | s_allocate(JacobianWorkspace& jacobianWorkspace, std::index_sequence<Ints...>);
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.h:221:30: error: ‘std::index_sequence’ has not been declared
221 | void linearizeOplusNs(std::index_sequence<Ints...>);
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:221:44: error: expected ‘,’ or ‘...’ before ‘<’ token
221 | void linearizeOplusNs(std::index_sequence<Ints...>);
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.h:245:38: error: ‘std::index_sequence’ has not been declared
245 | std::index_sequence<Ints...>);
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:245:52: error: expected ‘,’ or ‘...’ before ‘<’ token
245 | std::index_sequence<Ints...>);
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.h:250:65: error: ‘std::index_sequence’ has not been declared
250 | oid constructOffDiagonalQuadraticFormMs(const AtOType&, std::index_sequence<>);
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:250:79: error: expected ‘,’ or ‘...’ before ‘<’ token
250 | ffDiagonalQuadraticFormMs(const AtOType&, std::index_sequence<>);
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.h:253:69: error: ‘std::index_sequence’ has not been declared
253 | constructOffDiagonalQuadraticFormMs(const AtOType& AtO, std::index_sequence<Ints...>);
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:253:83: error: expected ‘,’ or ‘...’ before ‘<’ token
253 | ctOffDiagonalQuadraticFormMs(const AtOType& AtO, std::index_sequence<Ints...>);
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.h:270:3: error: ‘HessianTuple’ does not name a type; did you mean ‘HessianTupleType’?
270 | HessianTuple _hessianTuple;
| ^~~~~~~~~~~~
| HessianTupleType
/usr/local/include/g2o/core/base_fixed_sized_edge.h:271:3: error: ‘HessianTupleTransposed’ does not name a type; did you mean ‘HessianTupleType’?
271 | HessianTupleTransposed _hessianTupleTransposed;
| ^~~~~~~~~~~~~~~~~~~~~~
| HessianTupleType
/usr/local/include/g2o/core/base_fixed_sized_edge.h: In constructor ‘g2o::BaseFixedSizedEdge<D, E, VertexTypes>::BaseFixedSizedEdge()’:
/usr/local/include/g2o/core/base_fixed_sized_edge.h:193:9: error: class ‘g2o::BaseFixedSizedEdge<D, E, VertexTypes>’ does not have any field named ‘_hessianTuple’
193 | _hessianTuple(internal::createHessianMaps(_hessianTuple)),
| ^~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:193:51: error: ‘_hessianTuple’ was not declared in this scope; did you mean ‘HessianTupleType’?
193 | _hessianTuple(internal::createHessianMaps(_hessianTuple)),
| ^~~~~~~~~~~~~
| HessianTupleType
/usr/local/include/g2o/core/base_fixed_sized_edge.h:194:9: error: class ‘g2o::BaseFixedSizedEdge<D, E, VertexTypes>’ does not have any field named ‘_hessianTupleTransposed’
194 | _hessianTupleTransposed(internal::createHessianMaps(_hessianTupleTransposed)),
| ^~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.h:194:61: error: ‘_hessianTupleTransposed’ was not declared in this scope
194 | _hessianTupleTransposed(internal::createHessianMaps(_hessianTupleTransposed)),
| ^~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/g2o/core/base_fixed_sized_edge.h:278,
from /usr/local/include/g2o/core/base_unary_edge.h:30,
from /home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp:8:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: At global scope:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:35:6: error: ‘bool g2o::BaseFixedSizedEdge<D, E, VertexTypes>::allVerticesFixedNs’ is not a static data member of ‘class g2o::BaseFixedSizedEdge<D, E, VertexTypes>’
35 | bool BaseFixedSizedEdge<D, E, VertexTypes...>::allVerticesFixedNs(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:36:10: error: template definition of non-template ‘bool g2o::BaseFixedSizedEdge<D, E, VertexTypes>::allVerticesFixedNs’
36 | std::index_sequence<Ints...>) const {
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:36:10: error: ‘index_sequence’ is not a member of ‘std’
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: In member function ‘virtual bool g2o::BaseFixedSizedEdge<D, E, VertexTypes>::allVerticesFixed() const’:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:43:34: error: ‘make_index_sequence’ is not a member of ‘std’
43 | return allVerticesFixedNs(std::make_index_sequence<_nr_of_vertices>());
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:43:71: error: expected primary-expression before ‘)’ token
43 | return allVerticesFixedNs(std::make_index_sequence<_nr_of_vertices>());
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: In member function ‘virtual void g2o::BaseFixedSizedEdge<D, E, VertexTypes>::constructQuadraticForm()’:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:55:35: error: ‘make_index_sequence’ is not a member of ‘std’
55 | std::make_index_sequence<_nr_of_vertices>());
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:55:72: error: expected primary-expression before ‘)’ token
55 | std::make_index_sequence<_nr_of_vertices>());
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:58:35: error: ‘make_index_sequence’ is not a member of ‘std’
58 | std::make_index_sequence<_nr_of_vertices>());
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:58:72: error: expected primary-expression before ‘)’ token
58 | std::make_index_sequence<_nr_of_vertices>());
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: At global scope:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:65:74: error: ‘std::index_sequence’ has not been declared
65 | formationType& omega, const ErrorVector& weightedError, std::index_sequence<Ints...>) {
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:65:88: error: expected ‘,’ or ‘...’ before ‘<’ token
65 | nType& omega, const ErrorVector& weightedError, std::index_sequence<Ints...>) {
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:75:26: error: ‘std::index_sequence’ has not been declared
75 | const AtOType&, std::index_sequence<>) {}
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:75:40: error: expected ‘,’ or ‘...’ before ‘<’ token
75 | const AtOType&, std::index_sequence<>) {}
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:80:30: error: ‘std::index_sequence’ has not been declared
80 | const AtOType& AtO, std::index_sequence<Ints...>) {
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:80:44: error: expected ‘,’ or ‘...’ before ‘<’ token
80 | const AtOType& AtO, std::index_sequence<Ints...>) {
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: In member function ‘void g2o::BaseFixedSizedEdge<D, E, VertexTypes>::constructOffDiagonalQuadraticFormM(const AtOType&)’:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:98:45: error: ‘_hessianTupleTransposed’ was not declared in this scope; did you mean ‘hessianTransposed’?
98 | auto& hessianTransposed = std::get<K>(_hessianTupleTransposed);
| ^~~~~~~~~~~~~~~~~~~~~~~
| hessianTransposed
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:101:35: error: ‘_hessianTuple’ was not declared in this scope; did you mean ‘HessianTupleType’?
101 | auto& hessian = std::get<K>(_hessianTuple);
| ^~~~~~~~~~~~~
| HessianTupleType
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: In member function ‘void g2o::BaseFixedSizedEdge<D, E, VertexTypes>::constructQuadraticFormN(const InformationType&, const ErrorVector&)’:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:122:54: error: ‘make_index_sequence’ is not a member of ‘std’
122 | constructOffDiagonalQuadraticFormMs<N>(AtO, std::make_index_sequence<_nr_of_vertices - N - 1>());
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:122:99: error: expected primary-expression before ‘)’ token
122 | Ms<N>(AtO, std::make_index_sequence<_nr_of_vertices - N - 1>());
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: In member function ‘virtual void g2o::BaseFixedSizedEdge<D, E, VertexTypes>::linearizeOplus(g2o::JacobianWorkspace&)’:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:129:51: error: ‘make_index_sequence’ is not a member of ‘std’
129 | linearizeOplus_allocate(jacobianWorkspace, std::make_index_sequence<_nr_of_vertices>());
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:129:88: error: expected primary-expression before ‘)’ token
129 | jacobianWorkspace, std::make_index_sequence<_nr_of_vertices>());
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: At global scope:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:136:48: error: ‘std::index_sequence’ has not been declared
136 | JacobianWorkspace& jacobianWorkspace, std::index_sequence<Ints...>) {
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:136:62: error: expected ‘,’ or ‘...’ before ‘<’ token
136 | JacobianWorkspace& jacobianWorkspace, std::index_sequence<Ints...>) {
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:190:70: error: variable or field ‘linearizeOplusNs’ declared void
190 | eFixedSizedEdge<D, E, VertexTypes...>::linearizeOplusNs(std::index_sequence<Ints...>) {
| ^~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:190:70: error: ‘index_sequence’ is not a member of ‘std’
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: In member function ‘virtual void g2o::BaseFixedSizedEdge<D, E, VertexTypes>::linearizeOplus()’:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:199:25: error: ‘make_index_sequence’ is not a member of ‘std’
199 | linearizeOplusNs(std::make_index_sequence<_nr_of_vertices>());
| ^~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:199:62: error: expected primary-expression before ‘)’ token
199 | linearizeOplusNs(std::make_index_sequence<_nr_of_vertices>());
| ^
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp: In member function ‘virtual void g2o::BaseFixedSizedEdge<D, E, VertexTypes>::mapHessianMemory(number_t*, int, int, bool)’:
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:225:57: error: ‘_hessianTupleTransposed’ was not declared in this scope
225 | tuple_apply_i(MapHessianMemoryK{d, vj_dim, vi_dim}, _hessianTupleTransposed,
| ^~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/g2o/core/base_fixed_sized_edge.hpp:228:57: error: ‘_hessianTuple’ was not declared in this scope; did you mean ‘HessianTupleType’?
228 | tuple_apply_i(MapHessianMemoryK{d, vi_dim, vj_dim}, _hessianTuple,
| ^~~~~~~~~~~~~
| HessianTupleType
/home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp: In member function ‘virtual bool VertexPose::read(std::istream&)’:
/home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp:262:44: warning: no return statement in function returning non-void [-Wreturn-type]
262 | virtual bool read(istream &in) override {}
| ^
/home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp: In member function ‘virtual bool VertexPose::write(std::ostream&) const’:
/home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp:264:52: warning: no return statement in function returning non-void [-Wreturn-type]
264 | virtual bool write(ostream &out) const override {}
| ^
/home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp: In member function ‘virtual bool EdgeProjection::read(std::istream&)’:
/home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp:298:44: warning: no return statement in function returning non-void [-Wreturn-type]
298 | virtual bool read(istream &in) override {}
| ^
/home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp: In member function ‘virtual bool EdgeProjection::write(std::ostream&) const’:
/home/liqiang/slambook2/ch7/pose_estimation_3d2d.cpp:300:52: warning: no return statement in function returning non-void [-Wreturn-type]
300 | virtual bool write(ostream &out) const override {}
| ^
make[2]: *** [CMakeFiles/pose_estimation_3d2d.dir/build.make:63: CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:86: CMakeFiles/pose_estimation_3d2d.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
解决办法:
参考博主的文章Ubuntu20.04编译编译视觉SLAM十四讲slambook2/ch7:https://blog.csdn.net/weixin_53660567/article/details/120330485
将在/slambook2/ch13/中的CMakeList.txt文件中,原来的代码如下:
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-std=c++11 -O3 -fopenmp -pthread")
新的代码修改为:
set(CMAKE_CXX_FLAGS "-std=c++14 -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-std=c++14 -O3 -fopenmp -pthread")
因为Ubuntu20.04默认安装的是c++14!!!!
解决方法:不要在/slambook2/ch13/bin中执行。按照slambook2书中的指示,在命令行中运行 /slambook2/ch13/的终端中执行
./bin/run_kitti_stereo
由于ch13是整本书的综合实践,需要全面利用基础知识、图像处理、特征提取等知识,所以这里只是完成了编译,后续大家有兴趣可以对理论基础进行讨论。
利用KITTI数据集进行编译后执行的动画效果:
视觉SLAM ch13实践章节 编译并跑通KITTI数据集