学无先后,达者为师

网站首页 编程语言 正文

cartographer 编译遇到 abseil的问题

作者:u010647296 更新时间: 2022-07-21 编程语言

1 abseil是做什么的

Abseil是C ++库代码的开源集合,旨在增强C ++标准库。Abseil库代码是从Google自己的C ++代码库中收集的,已经过广泛测试并在生产中使用,并且与我们日常编码工作中所依赖的代码相同。

在某些情况下,Abseil提供了C ++标准中缺少的内容;在其他情况下,Abseil提供了针对标准的替代方法,以满足我们通过在Google代码库中的使用而发现的特殊需求。我们会在我们提供给您的库代码中清楚地表示这些情况。Abseil并不意味着要成为标准库的竞争对手。
参见:如何评价 Google 开源其 C++ 基础库 Abseil?

2 在编译的时候遇到abseil错误怎么办

   multiple rules generate abseil
   等其他与abseil相关的错误

这里参照:cartographer中abseil库依赖改造

cartographer中abseil的原生在线依赖

cartographer/blob/master/cmake/modules/FindAbseil.cmake#L66

  ExternalProject_Add(${ABSEIL_PROJECT_NAME}
    PREFIX ${ABSEIL_PROJECT_NAME}
    GIT_REPOSITORY   https://github.com/abseil/abseil-cpp.git
    GIT_TAG          7b46e1d31a6b08b1c6da2a13e7b151a20446fa07
    INSTALL_COMMAND  ""
    BUILD_COMMAND    ${CMAKE_COMMAND} --build "${ABSEIL_PROJECT_BUILD_DIR}"
    CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON;-DBUILD_TESTING:BOOL=OFF;-DCMAKE_BUILD_TYPE:STRING=Release"
    BUILD_BYPRODUCTS "${ABSEIL_LIBRARY_PATH};${ABSEIL_DEPENDENT_LIBRARIES}"
  )

会在ros的工作空间下的build_isolated下下载编译,并最后安装在install_isolated, carto_grapher_ros会依赖它。

3 记录 :

1 安装abseil

	
set -o errexit
set -o verbose

git clone https://github.com/abseil/abseil-cpp.git
cd abseil-cpp
git checkout d902eb869bcfacc1bad14933ed9af4bed006d481
mkdir build
cd build
cmake -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
  -DCMAKE_INSTALL_PREFIX=/usr/local/stow/absl \
  ..
ninja
sudo ninja install
cd /usr/local/stow
sudo stow absl

2 cartographer中

/src/cartographer/CMakeLists.txt
CMakeList.txt 第1处:

find_package(Abseil REQUIRED) --> find_package(absl REQUIRED)
CMakeList.txt 第2处:#默认的库文件是 standalone_absl
target_link_libraries(${PROJECT_NAME} PUBLIC ${PROTOBUF_LIBRARY}
absl::base
absl::synchronization
absl::strings
absl::flat_hash_map
absl::numeric
absl::flags)

/src/cartographer/cartographer-config.cmake.in 1处

find_package(Abseil ${QUIET_OR_REQUIRED_OPTION}) Abseil 改为 absl

3 cartographer_ros中

/src/cartographer_ros/cartographer_ros/CMakeLists.txt

find_package(Abseil REQUIRED)  -->find_package(absl REQUIRED)

4 cartographer_rviz中

/src/cartographer_ros/cartographer_rviz/CMakeLists.txt

find_package(Abseil REQUIRED)  -->find_package(absl REQUIRED)

4

重新编译

另外如果在package里面想要调用同workspace其他的package
1.在Cmakelists.txt 里面
	set(PACKAGE_DEPENDENCIES

		xxxx
  )
2.在package.xml中
<depend>xxxx</depend>

原文链接:https://blog.csdn.net/u010647296/article/details/125897259

栏目分类
最近更新