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

    imu_utils编译到最后报连接器错误。这是我的报错和我的cmake文件,请鱼大佬帮我看一下

    已定时 已固定 已锁定 已移动 已解决
    ROS2机器人开发:从入门到实践
    ros2 rclcpp
    3
    13
    716
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Y
      yuan @小伊
      最后由 编辑

      @小伊 这个已解决,但是我colcon build的时候把build,install,log都删除之后再colcon build的时候就报如下错误

      ysh@ysh:~/ros2_ws$ colcon build 
      Starting >>> code_utils
      Finished <<< code_utils [0.44s]                     
      Starting >>> imu_utils
      [1.015s] WARNING:colcon.colcon_cmake.task.cmake.build:Could not build CMake package 'imu_utils' because the CMake cache has no 'CMAKE_PROJECT_NAME' variable
      --- stderr: imu_utils
      Traceback (most recent call last):
        File "/home/ysh/.local/lib/python3.10/site-packages/colcon_core/executor/__init__.py", line 91, in __call__
          rc = await self.task(*args, **kwargs)
        File "/home/ysh/.local/lib/python3.10/site-packages/colcon_core/task/__init__.py", line 93, in __call__
          return await task_method(*args, **kwargs)
        File "/usr/lib/python3/dist-packages/colcon_ros/task/catkin/build.py", line 79, in build
          has_install_target = await has_target(args.build_base, 'install')
        File "/usr/lib/python3/dist-packages/colcon_cmake/task/cmake/__init__.py", line 56, in has_target
          if 'Unix Makefiles' in generator:
      TypeError: argument of type 'NoneType' is not iterable
      ---
      Failed   <<< imu_utils [0.30s, exited with code 1]
      
      Summary: 1 package finished [0.92s]
        1 package failed: imu_utils
        1 package had stderr output: imu_utils
      argument of type 'NoneType' is not iterable
      
      1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        从您提供的错误信息来看,imu_utils 这个包在构建时遇到了问题,主要是因为 CMake 缓存中没有找到 CMAKE_PROJECT_NAME 变量,这通常意味着 CMake 没有正确配置或者 CMake 缓存文件(如 CMakeCache.txt)可能已损坏或不存在。此外,还出现了一个类型错误,表明在尝试迭代一个 NoneType 类型的对象,这通常发生在尝试访问或操作未正确初始化的变量时。

        这里有几个步骤可以帮助您解决这个问题:

        1. 清理 CMake 缓存:
          由于您已经删除了 build、install 和 log 目录,您应该确保 CMake 的缓存也被清除。在您的包目录(imu_utils)中,查找并删除任何 CMakeCache.txt 文件。

        2. 重新配置 CMake:
          当您运行 colcon build 时,它应该会自动重新配置 CMake。但是,如果自动配置失败,您可以尝试手动运行 CMake 配置步骤。在您的包目录下(假设是 imu_utils),运行:

          mkdir -p build
          cd build
          cmake ..
          

          注意,这可能需要您先安装 CMake(如果尚未安装),并确保 CMake 的版本与您的 ROS 2 环境兼容。

        3. 检查 CMakeLists.txt:
          打开 imu_utils 的 CMakeLists.txt 文件,确保它包含正确设置 project() 命令的行,这通常位于文件的顶部。例如:

          cmake_minimum_required(VERSION 3.0.2)
          project(imu_utils)
          
        4. 运行 colcon build:
          在您的 ROS 2 工作空间根目录下,再次运行 colcon build。

        5. 检查 ROS 2 和 colcon 的版本:
          确保您安装的 ROS 2 和 colcon 的版本兼容。有时候,软件包的更新可能会破坏现有的构建配置。

        6. 查看更详细的日志:
          如果问题仍然存在,您可以尝试在 colcon build 命令中添加 --packages-select imu_utils --event-handlers console_direct+ 来获取更详细的构建日志,这有助于诊断问题。

        7. 搜索类似的错误:
          在 ROS 2 社区、Stack Overflow 或其他论坛中搜索类似的错误和解决方案。

        如果以上步骤都不能解决问题,您可能需要更详细地检查 imu_utils 包的源代码或寻求来自该包维护者或 ROS 2 社区的帮助。


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

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

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

          @小伊 我的imu_utils在src目录下,imu_utils里面也没有build文件夹

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

            如果你在使用 imu_utils 这个库,并且它位于你的项目的 src 目录下,同时该目录下没有 build 文件夹,这意呀着你可能还没有进行过编译构建的过程。imu_utils 是一个通常用于处理IMU(惯性测量单元)数据的工具集,它可能包含了一些C++代码,这些代码需要被编译成可执行文件或库文件才能在你的项目中使用。

            以下是一些步骤,你可以按照这些步骤来编译 imu_utils 并确保它能够在你的项目中正确运行:

            1. 创建构建目录

            首先,在你的 imu_utils 目录(或者它的父目录,这取决于你的偏好)中创建一个名为 build 的新目录。这个目录将用于存放编译过程中生成的所有文件,以避免污染源代码目录。

            mkdir build
            cd build
            

            2. 配置CMake(如果适用)

            如果 imu_utils 是使用 CMake 作为构建系统的,你需要在 build 目录中运行 CMake 来配置项目。确保你的系统上已经安装了 CMake。

            cmake ../path/to/imu_utils
            

            注意:将 ../path/to/imu_utils 替换为你的 imu_utils 目录的实际路径。如果你的 imu_utils 目录就在当前目录下,那么可以使用 ../。

            3. 编译

            配置完 CMake 后,你可以使用 make 命令(在 Linux 或 macOS 上)或相应的命令(如 Windows 上的 Visual Studio 构建系统)来编译项目。

            make
            

            这个命令会根据 CMake 生成的构建文件来编译项目。

            4. 使用编译后的文件

            编译完成后,你的可执行文件或库文件将位于 build 目录的相应子目录中(通常是 bin 或 lib 目录,但这取决于 CMakeLists.txt 的配置)。你可以将这些文件添加到你的项目中,或者直接在命令行中运行可执行文件。

            5. 注意事项

            • 确保你的开发环境(如编译器、CMake等)已经正确安装并配置。
            • 如果你在编译过程中遇到错误,检查 CMakeLists.txt 文件以确保所有依赖都已正确指定,并且你的系统满足所有依赖要求。
            • 如果 imu_utils 是从网上下载的,确保你下载的是正确的版本,并且没有遗漏任何文件。

            如果你不熟悉 CMake 或编译过程,可能需要花一些时间来学习这些工具的基础知识。不过,一旦你掌握了它们,你就可以轻松地构建和使用各种开源库和工具了。


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

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

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

              @小伊 按照你说的做,他现在是这样的

              ysh@ysh:~/ros2_ws/src/imu_utils$ mkdir build
              cd build
              ysh@ysh:~/ros2_ws/src/imu_utils/build$ make
              make: *** 没有指明目标并且找不到 makefile。 停止。
              ysh@ysh:~/ros2_ws/src/imu_utils/build$ cmake ..
              -- Found ament_cmake: 1.3.9 (/opt/ros/humble/share/ament_cmake/cmake)
              -- Found required Ceres dependency: Eigen version 3.4.0 in /usr/include/eigen3
              -- Found required Ceres dependency: glog
              -- Found required Ceres dependency: gflags
              -- Found Ceres version: 2.0.0 installed in: /usr with components: [EigenSparse, SparseLinearAlgebraLibrary, LAPACK, SuiteSparse, CXSparse, SchurSpecializations, Multithreading]
              -- Configuring done
              -- Generating done
              -- Build files have been written to: /home/ysh/ros2_ws/src/imu_utils
              ysh@ysh:~/ros2_ws/src/imu_utils/build$ make
              make: *** 没有指明目标并且找不到 makefile。 停止。
              ysh@ysh:~/ros2_ws/src/imu_utils/build$ make
              make: *** 没有指明目标并且找不到 makefile。 停止。
              
              
              1 条回复 最后回复 回复 引用 0
              • 小伊小
                机器人小伊
                最后由 编辑

                从你提供的输出来看,问题出在make命令上,它提示“没有指明目标并且找不到makefile”。这通常意味着在build目录下没有生成Makefile文件,或者Makefile文件的路径不正确。但是,从cmake ..的输出来看,CMake 似乎已经成功运行,并且声称已经将构建文件写入到了/home/ysh/ros2_ws/src/imu_utils,这看起来是一个错误,因为通常CMake会在build目录下生成Makefile。

                这里有几个步骤可以帮助你解决这个问题:

                1. 确认CMake的输出目录:
                  确保CMake的输出目录确实是build目录。从输出看,它可能错误地指向了/home/ysh/ros2_ws/src/imu_utils。但通常情况下,你应该在build目录下运行CMake。如果CMake配置有误,可能需要检查CMakeLists.txt文件,看看是否有设置输出目录的指令(如set(CMAKE_BINARY_DIR ...)),但这在标准的ROS 2包中是不常见的。

                2. 重新在build目录下运行CMake:
                  你已经在build目录下运行了CMake,但让我们再次确认。首先,确保你在build目录下,然后运行:

                  cd ~/ros2_ws/src/imu_utils/build
                  cmake ..
                  

                  注意,cmake ..命令中的..表示CMake应该查看当前目录的上一级目录(即imu_utils目录)来查找CMakeLists.txt文件。

                3. 检查build目录下的文件:
                  运行CMake后,检查build目录下是否生成了Makefile和其他CMake生成的文件(如CMakeCache.txt、cmake_install.cmake等)。

                4. 运行make:
                  如果Makefile和其他文件都正确生成在build目录下,你现在应该能够运行make来编译你的项目:

                  make
                  
                5. 检查CMakeLists.txt:
                  如果以上步骤仍然无法解决问题,请检查imu_utils目录下的CMakeLists.txt文件,确保它正确无误地配置了项目,并且没有指向错误的目录或文件。

                6. 清理和重建:
                  如果可能,你可以尝试删除build目录并重新创建它,然后再次运行CMake和make:

                  rm -rf ~/ros2_ws/src/imu_utils/build
                  mkdir -p ~/ros2_ws/src/imu_utils/build
                  cd ~/ros2_ws/src/imu_utils/build
                  cmake ..
                  make
                  

                如果上述步骤仍然无法解决问题,可能需要更详细地查看CMakeLists.txt文件,或者检查是否有其他配置或环境问题影响CMake和make的执行。


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

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

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

                  @小伊
                  这个是cmake文件

                  cmake_minimum_required(VERSION 3.10)
                  project(imu_utils)
                  if(POLICY CMP0057)
                      cmake_policy(SET CMP0057 NEW)
                  endif()
                  ## Compile as C++11, supported in ROS Kinetic and newer
                  set(CMAKE_BUILD_TYPE "Release")
                  #set(CMAKE_CXX_FLAGS "-std=c++11")
                  set(CMAKE_CXX_STANDARD 17)
                  #-DEIGEN_USE_MKL_ALL")
                  set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g -fPIC")
                  
                  ## Find catkin macros and libraries
                  ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
                  ## is used, also find other catkin packages
                  
                  #link_directories(/opt/ros/humble/lib)
                  find_package(ament_cmake REQUIRED
                      roscpp REQUIRED
                      rclcpp REQUIRED
                      std_msgs REQUIRED
                      geometry_msgs REQUIRED
                      nav_msgs REQUIRED
                  
                      )
                  
                  ## System dependencies are found with CMake's conventions
                  # find_package(Boost REQUIRED COMPONENTS system)
                  find_package(OpenCV REQUIRED)
                  find_package(Ceres REQUIRED)
                  find_package(Eigen3  REQUIRED)
                  
                  include_directories(
                    ${ament_INCLUDE_DIRS}
                    ${CERES_INCLUDE_DIRS}
                    ${EIGEN3_INCLUDE_DIR}
                    ${code_utils_INCLUDE_DIRS}
                  )
                  
                  include_directories(/home/ysh/ros2_ws/install/code_utils/include)
                  include_directories(/opt/ros/humble/include/cv_bridge)
                  include_directories(/opt/ros/humble/include/sensor_msgs)
                  include_directories(/opt/ros/humble/include/rosidl_runtime_cpp)
                  include_directories(/opt/ros/humble/include/rosidl_runtime_c)
                  include_directories(/opt/ros/humble/include/std_msgs)
                  include_directories(/opt/ros/humble/include/rclcpp)
                  include_directories(/opt/ros/humble/include/rcl)
                  include_directories(/opt/ros/humble/include/message_filters)
                  include_directories(/opt/ros/humble/include/builtin_interfaces)
                  include_directories(/opt/ros/humble/include/rcutils)
                  include_directories(/opt/ros/humble/include/rmw)
                  include_directories(/opt/ros/humble/include/rcl_yaml_param_parser)
                  include_directories(/opt/ros/humble/include/rosidl_typesupport_interface)
                  include_directories(/opt/ros/humble/include/rcpputils)
                  include_directories(/opt/ros/humble/include/tracetools)
                  include_directories(/opt/ros/humble/include/rcl_interfaces)
                  include_directories(/opt/ros/humble/include/libstatistics_collector)
                  include_directories(/opt/ros/humble/include/statistics_msgs)
                  include_directories(/opt/ros/humble/include/image_transport)
                  include_directories(/opt/ros/humble/include/geometry_msgs)
                  #include_directories(/opt/ros/humble/include/rclcpp/rclcpp)
                  set(ACC_LIB_SOURCE_FILES
                      ${PROJECT_SOURCE_DIR}/src/acc_lib/allan_acc.cpp
                      ${PROJECT_SOURCE_DIR}/src/acc_lib/fitallan_acc.cpp
                      )
                  set(GYR_LIB_SOURCE_FILES
                      ${PROJECT_SOURCE_DIR}/src/gyr_lib/allan_gyr.cpp
                      ${PROJECT_SOURCE_DIR}/src/gyr_lib/fitallan_gyr.cpp
                      )
                  
                  add_executable(imu_an
                      src/imu_an.cpp
                      ${GYR_LIB_SOURCE_FILES}
                      ${ACC_LIB_SOURCE_FILES}
                      )
                  
                  target_link_libraries(imu_an ${ament_LIBRARIES} ${OpenCV_LIBS} ${CERES_LIBRARIES}  )
                  
                  ament_package()
                  
                  1 条回复 最后回复 回复 引用 0
                  • 小伊小
                    机器人小伊
                    最后由 编辑

                    这个CMake文件是为ROS 2(或类似ROS 2环境的ament构建系统)的imu_utils项目配置的。它主要做了以下几件事情:

                    1. 设置CMake版本和项目信息:

                      • 指定CMake的最低版本为3.10。
                      • 定义项目名为imu_utils。
                      • 设置C++标准为C++17,并设置了Release模式下的编译标志。
                    2. 依赖查找:

                      • 使用find_package查找ament_cmake、ROS 2相关的包(如roscpp, rclcpp等)、OpenCV、Ceres Solver和Eigen3等依赖。
                      • 需要注意的是,虽然ament_cmake的find_package语法支持链式查找依赖,但这里的示例可能略显混乱,因为ament_cmake通常用于ROS 2,而find_package(roscpp REQUIRED)等看起来更像ROS 1的语法。在ROS 2中,通常不需要单独查找roscpp等,因为它们作为ROS 2的一部分被自动处理。
                    3. 包含目录:

                      • 通过include_directories指令添加了许多头文件的搜索路径,包括ament、Ceres、Eigen3等依赖,以及ROS 2的一些内部库和消息类型。这里有一些路径可能是不必要的,特别是如果它们已经被find_package调用隐式包含的话。
                    4. 源文件设置:

                      • 定义了加速度计(ACC_LIB_SOURCE_FILES)和陀螺仪(GYR_LIB_SOURCE_FILES)相关的源文件。
                      • 将这些源文件与主程序imu_an.cpp一起添加到可执行文件imu_an中。
                    5. 链接库:

                      • 使用target_link_libraries将imu_an目标链接到所需的库,包括通过ament_LIBRARIES(这里可能不是ROS 2的标准用法,ROS 2通常不需要这样做)、OpenCV和Ceres Solver库。
                    6. ament包配置:

                      • 调用ament_package()来配置ament包。这是ROS 2特有的,用于创建ament兼容的包。

                    改进建议:

                    • 依赖查找:如果这是ROS 2项目,请确保使用正确的find_package语法来查找ROS 2相关的包。例如,find_package(rclcpp REQUIRED)是适当的,但find_package(roscpp REQUIRED)可能不是(除非你有特定的理由需要这样做,但通常不需要)。
                    • 包含目录:检查哪些目录是必需的,并去除不必要的include_directories调用。通常,find_package调用会自动设置正确的包含目录。
                    • CMake策略:虽然你设置了CMP0057策略,但最好检查并应用所有相关的CMake策略,以确保跨不同CMake版本的兼容性。
                    • 代码组织:考虑将源文件按逻辑分组到不同的目录中,并在CMakeLists.txt中相应地调整路径。
                    • CMake变量:使用CMake变量(如${PROJECT_SOURCE_DIR})来引用项目目录是一个好习惯,这有助于保持CMakeLists.txt的可移植性和可维护性。

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

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

                    1 条回复 最后回复 回复 引用 0
                    • 小鱼小
                      小鱼 技术大佬 @yuan
                      最后由 编辑

                      @yuan 你这个错误可以复制粘贴不:https://fishros.org.cn/forum/topic/151/提问前必看-不符合要求的问题拒绝回答

                      另外工程结构展示下呗

                      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                      Y 1 条回复 最后回复 回复 引用 0
                      • Y
                        yuan @小鱼
                        最后由 编辑

                        @小鱼 谢谢你哦,我已经解决啦

                        Y 1 条回复 最后回复 回复 引用 0
                        • Y
                          yuan @yuan
                          最后由 编辑

                          @yuan 少引入一个包嘿嘿,还有一个报错是看你之前的文件夹重复解决啦

                          1 条回复 最后回复 回复 引用 0
                          • 小鱼小 小鱼 将这个主题标记为已解决,在
                          • 小伊小 小伊 从 中的 社区运营 移动了该主题
                          • 第一个帖子
                            最后一个帖子
                          皖ICP备16016415号-7
                          Powered by NodeBB | 鱼香ROS