最近在学高翔博士的《SLAM十四讲》,在ch3中运行vistalizegeometry这个demo的时候,出现如下报错信息(图片版报错看不清的话,文末附文字版的报错信息):
刚开始我还以为是我pangolin安装有问题,后来发现是这个demo中的CMakeLists.txt配置不适合本机Ubuntu20.04的环境(和C++编译器版本有关系)
只需要更改CMakeLists.txt中的一行代码即可解决!!!!如图:
把第4行注释掉,
# set(CMAKE_CXX_FLAGS "-std=c++11") # 注释掉这一行!!!
即可顺利make,然后执行!
slamlearn@slamlearn-VirtualBox:~/slambook2/ch3/visualizeGeometry/build$ cmake ..
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/slamlearn/slambook2/ch3/visualizeGeometry/build
slamlearn@slamlearn-VirtualBox:~/slambook2/ch3/visualizeGeometry/build$ make
Scanning dependencies of target visualizeGeometry
[ 50%] Building CXX object CMakeFiles/visualizeGeometry.dir/visualizeGeometry.cpp.o
In file included from /usr/local/include/pangolin/utils/signal_slot.h:3,
from /usr/local/include/pangolin/windowing/window.h:35,
from /usr/local/include/pangolin/display/display.h:34,
from /usr/local/include/pangolin/pangolin.h:38,
from /home/slamlearn/slambook2/ch3/visualizeGeometry/visualizeGeometry.cpp:11:
/usr/local/include/sigslot/signal.hpp:109:79: error: ‘decay_t’ is not a member of ‘std’; did you mean ‘decay’?
109 | _weak_ptr_compatible_v = detail::is_weak_ptr_compatible<std::decay_t<P>>::value;
| ^~~~~~~
| decay
/usr/local/include/sigslot/signal.hpp:109:79: error: ‘decay_t’ is not a member of ‘std’; did you mean ‘decay’?
109 | _weak_ptr_compatible_v = detail::is_weak_ptr_compatible<std::decay_t<P>>::value;
| ^~~~~~~
| decay
/usr/local/include/sigslot/signal.hpp:109:87: error: template argument 1 is invalid
109 | weak_ptr_compatible_v = detail::is_weak_ptr_compatible<std::decay_t<P>>::value;
| ^
/usr/local/include/sigslot/signal.hpp:109:92: error: ‘::value’ has not been declared
109 | patible_v = detail::is_weak_ptr_compatible<std::decay_t<P>>::value;
| ^~~~~
/*报错信息太长!!!此处删除了中间部分大概200行的报错信息*/
1560 | auto &groups = detail::cow_write(m_slots);
| ^~~~~~~
/usr/local/include/sigslot/signal.hpp: In member function ‘void sigslot::signal_base< <template-parameter-1-1>, <template-parameter-1-2> >::clear()’:
/usr/local/include/sigslot/signal.hpp:1584:27: error: ‘m_slots’ was not declared in this scope
1584 | detail::cow_write(m_slots).clear();
| ^~~~~~~
/usr/local/include/sigslot/signal.hpp: In instantiation of ‘void sigslot::signal_base< <template-parameter-1-1>, <template-parameter-1-2> >::operator()(U&& ...) [with U = {pangolin::VarState::Event}; Lockable = std::mutex; T = {pangolin::VarState::Event}]’:
/usr/local/include/pangolin/var/varstate.h:264:23: required from ‘std::map<std::__cxx11::basic_string<char>, std::shared_ptr<pangolin::VarValueGeneric> >::iterator pangolin::VarState::AddUpgradedVar(const std::shared_ptr<pangolin::VarValue<T> >&, const iterator&, bool) [with T = bool; std::map<std::__cxx11::basic_string<char>, std::shared_ptr<pangolin::VarValueGeneric> >::iterator = std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, std::shared_ptr<pangolin::VarValueGeneric> > >]’
/usr/local/include/pangolin/var/varstate.h:205:13: required from ‘std::shared_ptr<pangolin::VarValueGeneric> pangolin::VarState::GetOrCreateVar(const T&, const pangolin::VarMeta&) [with T = bool]’
/usr/local/include/pangolin/var/var.h:83:50: required from ‘pangolin::Var<T>::Var(const T&, const pangolin::VarMeta&) [with T = bool]’
/usr/local/include/pangolin/var/var.h:88:35: required from ‘pangolin::Var<T>::Var(const string&, const T&) [with T = bool; std::string = std::__cxx11::basic_string<char>]’
/usr/local/include/pangolin/display/widgets.h:153:50: required from here
/usr/local/include/sigslot/signal.hpp:1180:65: error: ‘slots_reference’ was not declared in this scope
1180 | cow_copy_type<list_type, Lockable> ref = slots_reference();
| ~~~~~~~~~~~~~~~^~
make[2]: *** [CMakeFiles/visualizeGeometry.dir/build.make:63:CMakeFiles/visualizeGeometry.dir/visualizeGeometry.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:76:CMakeFiles/visualizeGeometry.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2