鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    ROS2编译出错

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    ros2 编译出现错误
    2
    12
    634
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 2
      小张 @小伊
      最后由 编辑

      @小伊 gmake[2]: *** [CMakeFiles/yhs_can_interfaces__rosidl_generator_c.dir/build.make:610: libyhs_can_interfaces__rosidl_generator_c.so] Error 1
      gmake[1]: *** [CMakeFiles/Makefile2:213: CMakeFiles/yhs_can_interfaces__rosidl_generator_c.dir/all] Error 2
      gmake[1]: *** Waiting for unfinished jobs....
      gmake: *** [Makefile:146: all] Error 2

      1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        这些错误信息是在使用 GNU Make (通常简称为 make 或 gmake) 构建项目时出现的。错误表明在构建过程中遇到了问题,导致构建失败。错误具体来自于 ROS (Robot Operating System) 相关的组件构建,特别是与 rosidl_generator_c 相关的库。下面是一些可能的解决步骤和检查点:

        1. 检查依赖关系:

          • 确保所有必需的依赖项都已正确安装。对于 ROS 项目,这通常包括 ROS 2 的安装及其相关依赖。
          • 使用 rosdep 工具检查并安装缺失的依赖项。例如,在 ROS 2 工作空间中,你可以运行 rosdep install --from-paths src --ignore-src --rosdistro <your_ros_distro> 来安装依赖项(替换 <your_ros_distro> 为你的 ROS 发行版,如 foxy 或 galactic)。
        2. 查看详细的编译输出:

          • 错误日志中提到的 build.make 文件中的第 610 行可能是关键。尝试找到这一行,看看具体是什么命令或规则失败了。
          • 在运行 gmake 命令时,可以添加 VERBOSE=1 参数来获取更详细的编译输出,这有助于诊断问题。例如:gmake VERBOSE=1。
        3. 清理并重新构建:

          • 有时候,旧的构建文件可能会导致问题。尝试清理你的构建目录,然后重新构建。你可以使用 gmake clean 命令(如果定义了相应的清理目标)或者手动删除 build 和 install 目录,然后再次运行 colcon build(如果你在使用 ROS 2 的 colcon 构建系统)或 gmake。
        4. 检查 CMakeLists.txt 和 package.xml:

          • 确保 CMakeLists.txt 和 package.xml 文件中的配置正确无误。这些文件定义了构建系统的行为,包括如何找到依赖项和编译代码。
        5. 环境问题:

          • 确保你的环境变量设置正确,特别是与 ROS 相关的变量,如 ROS_DISTRO 和 CMAKE_PREFIX_PATH。
        6. 查看 ROS 社区和文档:

          • 如果问题依然存在,查看 ROS 社区论坛、Stack Overflow 或 ROS 的官方文档可能会提供解决方案或相似问题的讨论。

        通过以上步骤,你应该能够定位并解决构建过程中的问题。如果问题依然无法解决,可能需要更详细的日志信息或寻求来自 ROS 社区的帮助。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        2 2 条回复 最后回复 回复 引用 0
        • 2
          小张 @小伊
          最后由 编辑

          @小伊 在 ROS2编译出错 中说:

          build.make

          cmake_minimum_required(VERSION 3.8)

          project(yhs_can_interfaces)

          if(CMAKECOMPILER_IS_GNUCXX OR CMAKECXXCOMPILER_ID MATCHES "Clang")

          addCompile_options(-Wall -Wextra -Wpedantic)

          endif()

          find dependencies

          find_package(ament_cmake REQUIRED)

          find_package(rosidl_default_generators REQUIRED)

          find_package(std_msgs REQUIRED)

          uncomment the following section in order to fill in

          further dependencies manually.

          find_package(<dependency> REQUIRED)

          Generate messages

          rosidl_generate_interfaces(${PROJECT_NAME}

          "msg/BmsFlagFb.msg"

          "msg/BmsFb.msg"
          
          "msg/ChassisInfoFb.msg"
          
          "msg/CtrlCmd.msg"
          
          "msg/CtrlFb.msg"
          
          "msg/SteeringCtrlCmd.msg"
          
          "msg/SteeringCtrlFb.msg"
          
          "msg/FrontAngleFb.msg"
          
          "msg/IoCmd.msg"
          
          "msg/IoFb.msg"
          
          "msg/LrWheelFb.msg"
          
          "msg/RrWheelFb.msg"
          
          "msg/LfWheelFb.msg"
          
          "msg/RfWheelFb.msg"
          
          "msg/RearAngleFb.msg"
          

          DEPENDENCIES std_msgs

          )

          if(BUILD_TESTING)

          find_package(ament_lint_auto REQUIRED)

          the following line skips the linter which checks for copyrights

          comment the line when a copyright and license is added to all source files

          set(amentCmakeCopyrightFOUND TRUE)

          the following line skips cpplint (only works in a git repo)

          comment the line when this package is in a git repo and when

          a copyright and license is added to all source files

          set(amentCmakeCpplintFOUND TRUE)

          ament_lint_auto_find_test_dependencies()

          endif()

          ament_package()

          检查一下这个cmakelists.txt有问题么?

          1 条回复 最后回复 回复 引用 0
          • 小伊小
            机器人小伊
            最后由 编辑

            在您提供的 CMakeLists.txt 文件中,有几个潜在的问题和需要注意的地方。我将逐一指出并提供修改建议:

            1. 条件编译选项的变量名错误:
              您的代码中使用了 CMAKECOMPILER_IS_GNUCXX 和 CMAKECXXCOMPILER_ID,但正确的变量名应该是 CMAKE_COMPILER_IS_GNUCXX 和 CMAKE_CXX_COMPILER_ID。注意 CMAKE 和 COMPILER 之间需要有一个下划线。

              修改后的代码:

              if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
                  add_compile_options(-Wall -Wextra -Wpedantic)
              endif()
              
            2. find_package 指令的格式问题:
              在注释中提到“find dependencies”和“find_package(<dependency> REQUIRED)”,这里 <dependency> 应该被替换为实际的依赖包名。如果您的项目没有其他依赖,这部分可以保持注释状态或删除。

            3. rosidl_generate_interfaces 调用格式:
              这部分看起来是正确的,只要确保列出的消息文件确实存在于项目的 msg/ 目录下。

            4. 测试部分的条件编译:
              这部分代码处理测试依赖和跳过特定检查(如版权检查)。确保在适当的条件下注释或取消注释相关行。如果项目已经添加了版权信息并且位于 Git 仓库中,那么应该取消注释这些检查。

            5. 缩进和格式:
              虽然 CMake 对缩进的要求不如 Python 严格,但保持一致的缩进可以提高代码的可读性。建议使用两个空格或四个空格进行缩进,并保持一致。

            6. ament_package() 调用:
              这部分通常放在文件的末尾,看起来您的文件已经正确放置了这个调用。

            7. 文件顶部缺少包描述:
              通常,在 project() 调用之后,可以添加一些描述项目的变量,如 version 或 description。虽然这不是必需的,但对于理解项目很有帮助。

              例如:

              project(yhs_can_interfaces VERSION 0.0.0 DESCRIPTION "Description of the yhs_can_interfaces package")
              

            确保在修改 CMakeLists.txt 后重新运行 CMake 配置和构建过程,以检查所有修改是否已正确应用并解决了编译错误。


            以上为生成回答,仅供参考~

            我是小伊,已接入ChatGpt,所有回复,仅供参考~

            1 条回复 最后回复 回复 引用 0
            • 2
              小张 @小伊
              最后由 编辑

              @小伊 @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/interfaces__rosidl_generator_c.dir/rosidl_generator_c/interfaces/msg/detail/objects_info__functions.c.i"

              1 条回复 最后回复 回复 引用 0
              • 小伊小
                机器人小伊
                最后由 编辑

                这行命令是在使用CMake的构建系统中执行的一个特定操作。让我们一步步解析这个命令的含义:

                1. $(CMAKE_COMMAND):这部分代表CMake命令的路径。在CMake脚本中,CMAKE_COMMAND变量存储了CMake可执行文件的完整路径。这允许脚本在任何环境下正确调用CMake,无论CMake安装在哪个位置。

                2. -E:这是CMake命令行工具的一个选项,用于调用CMake的命令行模式(或称为“独立模式”)。在这个模式下,CMake可以执行一些与构建系统无关但很有用的命令,比如文件操作、环境查询等。

                3. cmake_echo_color:这是-E模式下CMake提供的一个命令,用于以特定颜色打印消息到控制台。这对于在构建过程中提供用户友好的输出非常有用。

                4. --switch=$(COLOR):这里指定了颜色切换的标志。$(COLOR)是一个变量,它应该在执行这个命令之前被设置为一个特定的值,这个值决定了接下来要使用的颜色。CMake可能提供了一些预定义的颜色变量,或者这个变量可能在脚本的其他部分被设置。

                5. --green:这个选项直接指定了接下来的消息应该以绿色显示。这意味着,无论$(COLOR)变量的值是什么,消息都会以绿色打印。这有点矛盾,因为通常--switch选项用于根据某个条件切换颜色,但在这里直接指定了颜色。可能是为了强调或确保消息以特定颜色显示。

                6. "Preprocessing C source to CMakeFiles/interfaces__rosidl_generator_c.dir/rosidl_generator_c/interfaces/msg/detail/objects_info__functions.c.i":这是要打印的消息内容。它表明CMake正在预处理一个C源文件,具体是将该文件处理到CMakeFiles/interfaces__rosidl_generator_c.dir/rosidl_generator_c/interfaces/msg/detail/objects_info__functions.c.i这个路径下。这通常涉及代码生成步骤,如从接口定义生成源代码。

                综上所述,这条命令的作用是以绿色打印一条消息到控制台,告知用户CMake正在预处理一个特定的C源文件。这种输出对于跟踪构建过程和理解CMake正在做什么非常有帮助。


                以上为生成回答,仅供参考~

                我是小伊,已接入ChatGpt,所有回复,仅供参考~

                2 1 条回复 最后回复 回复 引用 0
                • 2
                  小张
                  最后由 编辑

                  colcon build --packages-select vel_pub
                  Starting >>> vel_pub
                  --- stderr: vel_pub
                  CMake Error at CMakeLists.txt:21 (find_package):
                  By not providing "Findyhs_can_interfaces.cmake" in CMAKE_MODULE_PATH this
                  project has asked CMake to find a package configuration file provided by
                  "yhs_can_interfaces", but CMake did not find one.

                  Could not find a package configuration file provided by
                  "yhs_can_interfaces" with any of the following names:

                  yhs_can_interfacesConfig.cmake
                  yhs_can_interfaces-config.cmake
                  

                  Add the installation prefix of "yhs_can_interfaces" to CMAKE_PREFIX_PATH or
                  set "yhs_can_interfaces_DIR" to a directory containing one of the above
                  files. If "yhs_can_interfaces" provides a separate development package or
                  SDK, be sure it has been installed.


                  Failed <<< vel_pub [2.30s, exited with code 1]

                  Summary: 0 packages finished [3.60s]
                  1 package failed: vel_pub
                  1 package had stderr output: vel_pub

                  1 条回复 最后回复 回复 引用 0
                  • 2
                    小张 @小伊
                    最后由 编辑

                    @小伊
                    colcon build --packages-select vel_pub
                    Starting >>> vel_pub
                    --- stderr: vel_pub
                    /usr/bin/ld: /opt/ros/humble/lib/libstd_msgs__rosidl_generator_c.so: .dynsym local symbol at index 37 (>= sh_info of 3)
                    /usr/bin/ld: /opt/ros/humble/lib/libstd_msgs__rosidl_generator_c.so: invalid string offset 532178 >= 16358 for section `.dynstr'
                    /usr/bin/ld: /opt/ros/humble/lib/libstd_msgs__rosidl_generator_c.so: error adding symbols: no error
                    collect2: error: ld returned 1 exit status
                    gmake[2]: *** [CMakeFiles/vel_pub_node.dir/build.make:229: vel_pub_node] Error 1
                    gmake[1]: *** [CMakeFiles/Makefile2:137: CMakeFiles/vel_pub_node.dir/all] Error 2
                    gmake: *** [Makefile:146: all] Error 2

                    Failed <<< vel_pub [17.8s, exited with code 2]

                    Summary: 0 packages finished [19.2s]
                    1 package failed: vel_pub
                    1 package had stderr output: vel_pub

                    出现这问题是什么原因?

                    1 条回复 最后回复 回复 引用 0
                    • 小伊小
                      机器人小伊
                      最后由 编辑

                      您遇到的编译错误涉及到链接器(ld)在处理共享库 libstd_msgs__rosidl_generator_c.so 时遇到的问题。错误提示表明在解析 .dynsym 和 .dynstr 段时发生了问题,这通常与库文件的损坏或不兼容有关。这里有几个可能的原因和相应的解决方案:

                      1. 库文件损坏:

                        • libstd_msgs__rosidl_generator_c.so 可能已损坏或不完整。尝试重新安装或更新相关的 ROS 包可能会解决问题。
                        • 使用以下命令来重新安装 std_msgs 包(这可能也会更新或修复相关的生成库):
                          sudo apt-get install --reinstall ros-humble-std-msgs
                          
                      2. 环境配置问题:

                        • 确保您的 ROS 2 环境设置正确。特别是 LD_LIBRARY_PATH 应该包含 ROS 2 安装的库路径。
                        • 运行 source /opt/ros/humble/setup.bash 来确保环境变量正确设置(如果尚未设置)。
                      3. 编译器或链接器版本问题:

                        • 有时候,特定的编译器或链接器版本可能与 ROS 2 的某些部分不兼容。检查您的 GCC 和 Binutils 版本,确保它们与 ROS 2 Humble Hawksbill 兼容。
                        • 考虑更新或降级这些工具。
                      4. 清理并重建:

                        • 在尝试上述步骤之前,清理您的构建环境可能有助于解决问题。删除 build 和 install 目录,然后重新运行 colcon build。
                      5. 检查依赖关系:

                        • 确保所有依赖项都已正确安装。有时候,缺少一个小的依赖项也会导致链接错误。
                      6. 使用 Docker 或其他容器技术:

                        • 如果问题持续存在,考虑使用官方 ROS 2 Docker 镜像来避免本地环境可能引入的问题。
                      7. 查看 ROS 社区和 GitHub 问题跟踪:

                        • 有时候,这类问题可能是已知的 bug。查看 ROS 2 的 GitHub 仓库和相关社区论坛,看看是否有其他人遇到并解决了相同的问题。

                      如果上述步骤都不能解决问题,您可能需要更详细地检查构建日志,或者考虑在 ROS 社区中寻求更专业的帮助。


                      以上为生成回答,仅供参考~

                      我是小伊,已接入ChatGpt,所有回复,仅供参考~

                      2 1 条回复 最后回复 回复 引用 0
                      • 2
                        小张 @小伊
                        最后由 编辑

                        此回复已被删除!
                        1 条回复 最后回复 回复 引用 0
                        • 第一个帖子
                          最后一个帖子
                        皖ICP备16016415号-7
                        Powered by NodeBB | 鱼香ROS