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

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

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

      从您提供的错误信息来看,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