ros2 humble版本源码安装cartographer编译失败
-
背景:
在Ubuntu 22.04版本的ros2 humble上学习一下cartographer,并实现在gazebo仿真里进行SLAM建图。
问题描述:
我将cartographer和cartographer_ros源码克隆到我的src目录下,进行一键配置rosdep后,并进行了依赖的安装。但是在编译时出现了错误如下:
--- stderr: cartographer
CMake Error:
Error evaluating generator expression:$<LINK_LIBRARY:WHOLE_ARCHIVE,absl::log_flags>
Expression did not evaluate to a known generator expression
CMake Generate step failed. Build files cannot be regenerated correctly.
Failed <<< cartographer [0.55s, exited with code 1]
具体细节和上下文:
我原本使用的Ubuntu 20.04的ros2 foxy版本,因为实际需要,我将我的Ubuntu升级为22.04,并安装了ros2 humble版本。
ros2 humble是我自己安装的,依赖是一键安装的。
尝试过的解决办法:
1、我本以为将cartographer和cartographer_ros 包里的 $<LINK_LIBRARY:WHOLE_ARCHIVE,absl::log_flags>这个语句找到并加以修改,就会消除报错,但实际在项目文件夹下使用grep -r "$<LINK_LIBRARY:WHOLE_ARCHIVE,absl::log_flags>" .这个命令后,发现该语句都出现在log/的文件下,说名改语句是编译后生成的,所有此方法不行。
2、我以为是在cartgrapher和cartgrapher_ros包的CMakeLists.txt中缺少库,但是我发现是有的。
如果有人能解决这个问题,我将非常感谢! -
您遇到的问题是由于CMake在处理
$<LINK_LIBRARY:WHOLE_ARCHIVE,absl::log_flags>
这个表达式时失败了。这个表达式是CMake 3.13及以上版本引入的,用于在链接库时指定整个库归档(whole archive)选项。错误提示表明CMake无法识别这个表达式,这通常意味着CMake版本过低或者配置有误。在ROS 2 Humble中,CMake的版本要求是CMake 3.18或更高。首先,我们需要确认您系统中的CMake版本是否满足这一要求。您可以通过以下命令检查CMake版本:
cmake --version
如果CMake版本低于3.18,您需要升级CMake。您可以通过以下步骤来安装或升级CMake:
-
安装CMake 3.18或更高版本:
您可以从CMake的官方网站下载最新版本,或者使用包管理器安装(如果可用)。在Ubuntu上,您可以通过添加CMake的PPA来安装较新版本:sudo add-apt-repository ppa:kitware/cmake sudo apt-get update sudo apt-get install cmake
确认安装后,再次检查CMake版本。
-
重新配置和编译Cartographer:
在升级CMake后,您需要清除之前的构建文件并重新配置Cartographer。在您的cartographer
和cartographer_ros
工作区中,运行以下命令:cd ~/your_ros2_ws # 替换为您的工作区目录 rm -rf build install log colcon build --packages-select cartographer cartographer_ros
这将清除旧的构建文件并重新构建指定的包。
-
检查依赖关系:
确保所有必要的依赖项都已正确安装。您可以使用rosdep
来安装缺失的依赖项:rosdep install --from-paths src --ignore-src --rosdistro humble -y
然后再次尝试构建。
如果以上步骤仍然无法解决问题,可能需要检查Cartographer的CMakeLists.txt文件或相关配置是否有特定于版本的更改需求,或者考虑是否有其他系统级问题影响CMake的行为。此外,查看Cartographer的官方文档或GitHub仓库的issue页面也可能提供有用的信息或已知问题的解决方案。
以上为生成回答,仅供参考~
-
-
@小伊 cmake 是3.22.1版本,并且依赖项都已经正确安装。
-
看起来您正在使用 CMake 版本 3.22.1,并且已经确保所有依赖项都已正确安装。这是很好的起点!CMake 是一个跨平台的自动化构建系统,它使用
CMakeLists.txt
文件来定义项目的构建过程。如果您现在准备开始一个项目或解决构建问题,以下是一些基本步骤和考虑因素:
-
确保 CMakeLists.txt 文件正确配置:
- 确保您的
CMakeLists.txt
文件包含了正确的项目名称、C++ 标准(如果需要指定)、源文件列表、库依赖等。 - 如果您的项目依赖于外部库,您可能需要在
CMakeLists.txt
中使用find_package
或手动指定库路径。
- 确保您的
-
生成构建文件:
- 使用 CMake 生成适合您平台的构建文件。例如,在 Unix-like 系统(如 Linux 或 macOS)上,您可能会运行
cmake -B build -S .
来在build
目录中生成 Makefile。 - 在 Windows 上,您可能会生成 Visual Studio 项目文件或 MinGW Makefile,具体取决于您的编译器。
- 使用 CMake 生成适合您平台的构建文件。例如,在 Unix-like 系统(如 Linux 或 macOS)上,您可能会运行
-
编译项目:
- 使用生成的构建文件来编译项目。例如,在 Unix-like 系统上,您可以在生成 Makefile 后运行
cmake --build build
来编译项目。 - 在 Windows 上,如果您生成了 Visual Studio 项目文件,您可以直接在 Visual Studio 中打开
.sln
文件并编译。
- 使用生成的构建文件来编译项目。例如,在 Unix-like 系统上,您可以在生成 Makefile 后运行
-
解决依赖问题:
- 如果 CMake 在配置过程中报告缺少依赖项,确保所有必需的库都已正确安装,并且 CMake 能够找到它们。您可能需要设置环境变量(如
CMAKE_PREFIX_PATH
)或使用find_package
的HINTS
或PATHS
选项来指定搜索路径。
- 如果 CMake 在配置过程中报告缺少依赖项,确保所有必需的库都已正确安装,并且 CMake 能够找到它们。您可能需要设置环境变量(如
-
测试和验证:
- 编译完成后,运行测试(如果有的话)来验证项目的正确性。
- 检查任何构建警告或错误,并确保它们不会影响项目的功能。
-
文档和部署:
- 确保您的项目包含必要的文档,以便其他开发者可以理解和使用您的代码。
- 准备部署脚本或指南,以便将您的软件部署到目标环境。
如果您在构建过程中遇到具体问题,您可能需要查看 CMake 的输出日志,以确定是哪个步骤或配置导致了问题。此外,CMake 的官方文档和社区论坛也是解决问题的好资源。
以上为生成回答,仅供参考~
-
-
@2537271032 源码版本是不是humble的,要对应上
-
@小鱼 非常感谢回答我的问题,我的版本是ros2 humble 版本,我重装了linux系统后(装的是Ubuntu 22.04的镜像),问题就没有了,我估计是我在原来的Ubuntu 20.4升级到22.04中出现了问题,所有一直报错。