ubuntu22.04,ros2 humble下,安装cartographer时,执行src/cartographer/scripts/install_abseil.sh编译abseil-cpp过程中报错,解决办法。
下面我来分享一下遇到的2个报错的解决办法(改完之后重新执行sh脚本即可)。
1.报错一:
[25/105] Building CXX object absl/debu...andler.dir/failure_signal_handler.cc.o
FAILED: absl/debugging/CMakeFiles/failure_signal_handler.dir/failure_signal_handler.cc.o
/usr/bin/c++ -D__CLANG_SUPPORT_DYN_ANNOTATION__ -I/home/eaibot/cartoros2_ws/abseil-cpp -O3 -DNDEBUG -fPIC -Wall -Wextra -Wcast-qual -Wconversion-null -Wmissing-declarations -Woverlength-strings -Wpointer-arith -Wunused-local-typedefs -Wunused-result -Wvarargs -Wvla -Wwrite-strings -Wno-missing-field-initializers -Wno-sign-compare -std=gnu++11 -MD -MT absl/debugging/CMakeFiles/failure_signal_handler.dir/failure_signal_handler.cc.o -MF absl/debugging/CMakeFiles/failure_signal_handler.dir/failure_signal_handler.cc.o.d -o absl/debugging/CMakeFiles/failure_signal_handler.dir/failure_signal_handler.cc.o -c /home/eaibot/cartoros2_ws/abseil-cpp/absl/debugging/failure_signal_handler.cc
/home/eaibot/cartoros2_ws/abseil-cpp/absl/debugging/failure_signal_handler.cc: In function ‘bool absl::SetupAlternateStackOnce()’:
/home/eaibot/cartoros2_ws/abseil-cpp/absl/debugging/failure_signal_handler.cc:127:32: error: no matching function for call to ‘max(long int, int)’
127 | size_t stack_size = (std::max(SIGSTKSZ, 65536) + page_mask) & ~page_mask;
| ~~~~~~~~^~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/11/algorithm:61,
from /home/eaibot/cartoros2_ws/abseil-cpp/absl/debugging/failure_signal_handler.cc:31:
/usr/include/c++/11/bits/stl_algobase.h:254:5: note: candidate: ‘template<class _Tp> const _Tp& std::max(const _Tp&, const _Tp&)’
254 | max(const _Tp& __a, const _Tp& __b)
| ^~~
/usr/include/c++/11/bits/stl_algobase.h:254:5: note: template argument deduction/substitution failed:
/home/eaibot/cartoros2_ws/abseil-cpp/absl/debugging/failure_signal_handler.cc:127:32: note: deduced conflicting types for parameter ‘const _Tp’ (‘long int’ and ‘int’)
127 | size_t stack_size = (std::max(SIGSTKSZ, 65536) + page_mask) & ~page_mask;
| ~~~~~~~~^~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/11/algorithm:61,
------以下省略-----
解决办法:
①修改cartographer/scripts/install_abseil.sh如下图所示
②然后修改abseil-cpp/absl/debugging/failure_signal_handler.cc文件的127行
size_t stack_size = (std::max(SIGSTKSZ, 65536) + page_mask) & ~page_mask;
改成
size_t stack_size = (std::max<unsigned long>(SIGSTKSZ, 65536) + page_mask) & ~page_mask;
2.报错二:
[41/80] Building CXX object absl/synchronization/CMakeFiles/graphcycles_internal.dir/internal/graphcycles.cc.o
FAILED: absl/synchronization/CMakeFiles/graphcycles_internal.dir/internal/graphcycles.cc.o
/usr/bin/c++ -D__CLANG_SUPPORT_DYN_ANNOTATION__ -I/home/eaibot/cartoros2_ws/abseil-cpp -O3 -DNDEBUG -fPIC -Wall -Wextra -Wcast-qual -Wconversion-null -Wmissing-declarations -Woverlength-strings -Wpointer-arith -Wunused-local-typedefs -Wunused-result -Wvarargs -Wvla -Wwrite-strings -Wno-missing-field-initializers -Wno-sign-compare -std=gnu++17 -MD -MT absl/synchronization/CMakeFiles/graphcycles_internal.dir/internal/graphcycles.cc.o -MF absl/synchronization/CMakeFiles/graphcycles_internal.dir/internal/graphcycles.cc.o.d -o absl/synchronization/CMakeFiles/graphcycles_internal.dir/internal/graphcycles.cc.o -c /home/eaibot/cartoros2_ws/abseil-cpp/absl/synchronization/internal/graphcycles.cc
/home/eaibot/cartoros2_ws/abseil-cpp/absl/synchronization/internal/graphcycles.cc: In member function ‘void absl::synchronization_internal::GraphCycles::RemoveNode(void*)’:
/home/eaibot/cartoros2_ws/abseil-cpp/absl/synchronization/internal/graphcycles.cc:450:26: error: ‘numeric_limits’ is not a member of ‘std’
450 | if (x->version == std::numeric_limits<uint32_t>::max()) {
| ^~~~~~~~~~~~~~
/home/eaibot/cartoros2_ws/abseil-cpp/absl/synchronization/internal/graphcycles.cc:450:49: error: expected primary-expression before ‘>’ token
450 | if (x->version == std::numeric_limits<uint32_t>::max()) {
| ^
/home/eaibot/cartoros2_ws/abseil-cpp/absl/synchronization/internal/graphcycles.cc:450:52: error: ‘::max’ has not been declared; did you mean ‘std::max’?
450 | if (x->version == std::numeric_limits<uint32_t>::max()) {
| ^~~
| std::max
In file included from /usr/include/c++/11/algorithm:62,
from /home/eaibot/cartoros2_ws/abseil-cpp/absl/synchronization/internal/graphcycles.cc:38:
/usr/include/c++/11/bits/stl_algo.h:3467:5: note: ‘std::max’ declared here
3467 | max(initializer_list<_Tp> __l, _Compare __comp)
| ^~~
解决办法:
修改abseil-cpp/absl/synchronization/internal/graphcycles.cc文件,
添加 #include <limits>