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

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

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

      从你提供的CMake文件和错误信息来看,主要的问题可能在于链接库的配置。首先,确保你的CMake文件正确找到了所有必要的库,并且这些库在链接时都被正确引用。以下是一些可能的问题和建议的修复方法:

      1. 确保ament_cmake和find_package的使用正确:

        • 你使用了ament_cmake,这是ROS 2中用于构建包的标准方式。但你的find_package调用似乎混合了ROS 1和ROS 2的风格。对于ROS 2,你应该使用find_package来查找ROS 2的组件,而不是直接指定roscpp、rclcpp等,因为ament_cmake会自动处理这些。
        find_package(ament_cmake REQUIRED
            COMPONENTS
            rclcpp
            std_msgs
            geometry_msgs
            nav_msgs
            # 注意:这里假设code_utils是一个ROS 2包,否则可能需要调整
            code_utils
        )
        
        • 确保code_utils是一个有效的ROS 2包,或者它是一个普通的C++库,并且已经通过find_package或其他方式被正确找到。
      2. 链接库:

        • 你需要确保所有使用的库都被添加到target_link_libraries中。对于ROS 2的包,通常不需要显式添加它们的库,因为ament_target_dependencies会处理这些依赖。但是,对于非ROS 2的库(如OpenCV、Ceres、Eigen3),你需要确保它们被正确链接。
        target_link_libraries(imu_an
            ${ament_target_dependencies(imu_an)}
            ${OpenCV_LIBS}
            ${CERES_LIBRARIES}
        )
        
        • 注意使用ament_target_dependencies来自动处理ROS 2包的依赖。
      3. 包含目录:

        • 你已经包含了很多ROS的目录,但通常这些目录应该由find_package或ament_cmake自动处理。你可以减少手动添加的路径数量,仅当find_package或ament_cmake无法自动处理时才手动添加。
      4. 编译选项:

        • 确保编译选项适合你的项目需求。你已经设置了C++17标准,这是很好的。但是,-g通常用于调试构建,如果你正在构建发布版本,可能不需要它。
      5. 检查CMake输出:

        • 在运行CMake时,仔细查看输出信息,特别是关于find_package的结果。确保所有必要的包都被正确找到。
      6. 环境配置:

        • 确保你的ROS 2环境已正确设置,包括工作空间、安装目录等。
      7. 错误消息:

        • 如果可能,请提供具体的连接器错误消息,这将有助于更精确地诊断问题。

      按照这些步骤检查和修改你的CMake文件,应该可以解决你遇到的问题。如果问题仍然存在,请提供更多的错误详情,以便进一步分析。


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

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

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