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

    ROS2编译出错

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

      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 [18.8s, exited with code 2]

      Summary: 0 packages finished [20.5s]
      1 package failed: vel_pub
      1 package had stderr output: vel_pub
      a9a473bf-2232-4019-929d-e05eb6ff1562-image.png

      为什么我修改代码就编译出错呢

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

        您遇到的编译错误涉及到链接器(ld)在处理ROS 2库文件时遇到的问题。错误信息表明链接器在尝试链接libstd_msgs__rosidl_generator_c.so库时遇到了问题,这通常与库文件的损坏、不兼容或版本问题有关。以下是一些可能的解决步骤:

        1. 检查ROS 2安装:

          • 确保您的ROS 2安装是完整的,没有损坏。可以尝试重新安装ROS 2,特别是如果您最近进行了系统更新或升级了ROS 2版本。
        2. 更新和重建依赖:

          • 确保所有依赖项都是最新的。在ROS 2环境中,运行sudo apt update && sudo apt upgrade来更新您的系统包。
          • 清理并重新构建您的ROS 2工作空间。在您的工作空间目录下,运行以下命令:
            cd ~/your_ros2_workspace
            rm -rf build install log
            colcon build
            
          • 注意,这里的your_ros2_workspace应该替换为您实际的ROS 2工作空间目录。
        3. 检查环境变量:

          • 确保您的环境变量正确设置,特别是LD_LIBRARY_PATH,它应该包含ROS 2库的路径。可以通过打印这个环境变量来检查:
            echo $LD_LIBRARY_PATH
            
          • 如果不包含ROS 2的库路径,您需要添加它。通常,这可以通过在.bashrc或.zshrc文件中添加如下行来实现(假设您使用的是bash或zsh):
            source /opt/ros/humble/setup.bash
            
        4. 检查特定的库文件:

          • 尝试重新生成或修复有问题的库文件。这可能需要您直接访问ROS 2的源代码或安装目录,并尝试重新编译或替换有问题的库。
        5. 查看系统兼容性:

          • 确保您的操作系统和硬件平台与ROS 2版本兼容。有时候,特定的操作系统更新或硬件配置可能会导致兼容性问题。
        6. 查看ROS 2社区和问题跟踪:

          • 查看ROS 2的GitHub仓库或相关论坛,看看是否有其他人遇到并解决了类似的问题。

        如果以上步骤都不能解决问题,您可能需要更详细地检查您的代码修改,看看是否有可能引入了与链接器处理不兼容的代码更改。在某些情况下,特定的代码更改(如使用非标准的编译器标志或链接库)可能会导致链接错误。


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

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

        2 1 条回复 最后回复 回复 引用 0
        • 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