【问题标题】:eigen3 cmake error within a docker containerdocker容器中的eigen3 cmake错误
【发布时间】:2021-07-15 20:37:39
【问题描述】:

我正在尝试构建 ROS2 包,但出现此错误

CMake Error at /opt/ros/foxy/share/ament_cmake_target_dependencies/cmake/ament_target_dependencies.cmake:66 (message):
  ament_target_dependencies() the passed package name 'Eigen3::Eigen' was not
  found before
Call Stack (most recent call first):
  CMakeLists.txt:83 (ament_target_dependencies)

我正在尝试使用this 解决它,但是我无法确定哪个是我的 eigen3 安装源文件夹。

我应该对我的 CMakelist 进行哪些更改?

libeigen3-dev 已经是最新版本(3.3.7-2)。
还有
ros-foxy-eigen3-cmake-module 已经是最新版本(0.1.1-1focal.20210423.000604)。

CMakelist:

cmake_minimum_required(VERSION 3.5)
project(avoidance)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic")
endif()

find_package(ament_cmake REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(perception_pcl REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tf2 REQUIRED)

get_default_rmw_implementation(rmw_implementation)
find_package("${rmw_implementation}" REQUIRED)

find_package(geometry_msgs REQUIRED)
find_package(px4_msgs REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(std_msgs REQUIRED)

find_package(PythonInterp REQUIRED)
find_package(eigen3_cmake_module REQUIRED)
find_package(Eigen3 REQUIRED NO_MODULE)
find_package(Boost REQUIRED COMPONENTS system)
find_package(PCL REQUIRED)

if(DISABLE_SIMULATION)
  message(STATUS "Building avoidance without Gazebo Simulation")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDISABLE_SIMULATION")
else()
  message(STATUS "Building avoidance with Gazebo Simulation")
  find_package(yaml-cpp REQUIRED)
endif(DISABLE_SIMULATION)

#################
# Setup targets #
#################

## CMake Setup
# Build in Release mode if nothing is specified
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif(NOT CMAKE_BUILD_TYPE)

## Specify additional locations of header files
include_directories(
  include
  ${rclcpp_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
  ${YAML_CPP_INCLUDE_DIR}
)

## Declare a C++ library
set(AVOIDANCE_CPP_FILES
  "src/common.cpp"
  "src/histogram.cpp"
  "src/transform_buffer.cpp"
  "src/avoidance_node.cpp"
)
if(NOT DISABLE_SIMULATION)
  set(AVOIDANCE_CPP_FILES "${AVOIDANCE_CPP_FILES}" "src/rviz_world_loader.cpp")
endif()

# Add avoidance lib
add_library(avoidance SHARED "${AVOIDANCE_CPP_FILES}")
ament_target_dependencies(avoidance Eigen3 px4_msgs ${${PROJECT_NAME}_EXPORTED_TARGETS})
target_include_directories(avoidance PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/${PROJECT_NAME}>
  $<INSTALL_INTERFACE:include/${PROJECT_NAME}>
  ${Eigen3_INCLUDE_DIRS}
)

## Specify libraries to link a library or executable target against
target_link_libraries(
  avoidance
  Eigen3::Eigen
  ${YAML_CPP_LIBRARIES}
)

# Add node dependencies
ament_target_dependencies(avoidance px4_msgs rclcpp Eigen3::Eigen)

# Export information to downstream packages
ament_export_dependencies(ament_cmake rclcpp rosidl_default_runtime eigen3_cmake_module Eigen3 px4_msgs geometry_msgs sensor_msgs std_msgs)
ament_export_interfaces(export_avoidance HAS_LIBRARY_TARGET)
ament_export_include_directories(include)
ament_export_libraries(avoidance)

#############
## Install ##
#############

# Install header files
install(DIRECTORY include/${PROJECT_NAME}/
        DESTINATION include/${PROJECT_NAME}
        FILES_MATCHING PATTERN "*.h"
        PATTERN ".svn" EXCLUDE
)

# Install artifacts
install(TARGETS avoidance
        EXPORT export_avoidance
        ARCHIVE DESTINATION lib
        LIBRARY DESTINATION lib
        RUNTIME DESTINATION bin
        INCLUDES DESTINATION include
)

# Install launch files
install(DIRECTORY
        launch
        DESTINATION share/${PROJECT_NAME}
)

#############
## Testing ##
#############

# if(CATKIN_ENABLE_TESTING)
#     # Add gtest based cpp test target and link libraries
#     catkin_add_gtest(${PROJECT_NAME}-test test/main.cpp
#                                           test/test_common.cpp
#                                           test/test_usm.cpp
#                                           test/test_transform_buffer.cpp
#                     )
#
#     if(TARGET ${PROJECT_NAME}-test)
#       target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}
#                                                  ${catkin_LIBRARIES}
#                                                  ${YAML_CPP_LIBRARIES})
#     endif()
#
#
#     if (${CMAKE_BUILD_TYPE} STREQUAL "Coverage")
#         SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage --coverage")
#         SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage --coverage")
#         SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
#
#         add_custom_target(${PROJECT_NAME}-test_coverage
#             COMMAND lcov --zerocounters --directory ${PROJECT_BINARY_DIR}
#             COMMAND lcov --capture  --initial --no-external --directory ${PROJECT_BINARY_DIR} --base-directory ${${PROJECT_NAME}_SOURCE_DIR} --output-file base_coverage.info --rc lcov_branch_coverage=1
#             COMMAND ${PROJECT_NAME}-test
#             COMMAND lcov --capture  --no-external --directory ${PROJECT_BINARY_DIR} --base-directory ${${PROJECT_NAME}_SOURCE_DIR} --output-file test_coverage.info --rc lcov_branch_coverage=1
#             COMMAND lcov -a base_coverage.info -a test_coverage.info -o coverage.info --rc lcov_branch_coverage=1
#             COMMAND lcov --rc lcov_branch_coverage=1 --summary coverage.info
#             WORKING_DIRECTORY .
#             DEPENDS ${PROJECT_NAME}-test
#         )
#         add_custom_target(${PROJECT_NAME}-test_coverage_html
#             COMMAND genhtml coverage.info --output-directory out --branch-coverage
#             COMMAND x-www-browser out/index.html
#             WORKING_DIRECTORY .
#             DEPENDS ${PROJECT_NAME}-test_coverage
#         )
#     endif()
# endif()

ament_package()

【问题讨论】:

  • 请发布您的完整 CMakeLists.txt 文件。在尝试链接之前,您似乎忘记了find_package(Eigen.. )
  • eigen3_cmake_module 添加到您的ament_target_dependencies 是否可以解决问题?

标签: cmake eigen3 ros2


【解决方案1】:

看看nav2_smac_planner/CMakeLists.txt

我发现您实际上在ament_target_dependencies 中使用了Eigen3 而不是eigen3_cmake_module

他们还在ament_export_dependencies 中导出它。

所以...对于包含标头,您应该使用Eigen3,但在依赖方面,应该使用eigen3_cmake_modules

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 2019-02-21
    • 2017-01-07
    • 2017-05-24
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多