ROS篇——解决src/cartographer/scripts/install_abseil.sh编译abseil-cpp过程中报错的问题

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>

 解决了这两个问题,就可以重新执行src/cartographer/scripts/install_abseil.sh脚本了(至少我这边ubuntu22.04 ros2 humble的环境下,这样做完之后就可以了)

猜你喜欢

转载自blog.csdn.net/u011391361/article/details/131601115
今日推荐