0

I am trying to create and export a library in a ROS2 package (named uwrt_mars_rover_hw_bridge) and then use this library in another ROS2 package (named uwrt_mars_rover_utilities) in the same workspace (uwrt_ws). I was hoping someone would be able to spot the error in my code that is causing this issue. One potential problem is that the library I am attempting to export has multiple directories with both header and C++ files, but if possible I would not like to change this fact as I am not the author of that code. Here is the tree structure right now of the library:

uwrt_mars_rover_hw_bridge/
├── can
│   ├── CANMsgMap.cpp
│   ├── CANMsgMap.h
│   ├── generated_2021
│   │   ├── uwrt_mars_rover_can.c
│   │   ├── uwrt_mars_rover_can.dbc
│   │   ├── uwrt_mars_rover_can_dump.txt
│   │   ├── uwrt_mars_rover_can_enums.h
│   │   ├── uwrt_mars_rover_can.h
│   │   ├── uwrt_mars_rover_can_wrapper.cpp
│   │   └── uwrt_mars_rover_can_wrapper.h
│   ├── generated_2022
│   │   ├── uwrt_mars_rover_can.c
│   │   ├── uwrt_mars_rover_can.dbc
│   │   ├── uwrt_mars_rover_can_dump.txt
│   │   ├── uwrt_mars_rover_can_enums.h
│   │   ├── uwrt_mars_rover_can.h
│   │   ├── uwrt_mars_rover_can_wrapper.cpp
│   │   └── uwrt_mars_rover_can_wrapper.h
│   ├── uwrt_mars_rover_can_2021.yaml
│   └── uwrt_mars_rover_can_2022.yaml
├── CMakeLists.txt
├── include
│   └── uwrt_mars_rover_utils
│       └── hw_bridge.h
├── LICENSE
├── package.xml
├── README.md
├── scripts
│   ├── generate_can_enums.py
│   ├── generate_can.py
│   └── generate_can_wrapper.py
└── src
    └── hw_bridge.cpp

Please let me know if you require more information about the structure of the packages.

Here is the CMakeLists.txt that is creating and exporting the library (uwrt_mars_rover_hw_bridge package):

cmake_minimum_required(VERSION 3.8)
project(uwrt_mars_rover_hw_bridge)

if ("$ENV{TARGET}" MATCHES "2021$")
set(YEAR 2021)
elseif ("ENV{TARGET}" MATCHES "2022$")
set(YEAR 2022)
else ()
set(YEAR 2021) # default year to 2021
endif ()

if(NOT CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 20)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_components REQUIRED)



add_library(${PROJECT_NAME}_lib)

target_sources(${PROJECT_NAME}_lib PRIVATE
    src/hw_bridge.cpp
    can/CANMsgMap.cpp
    # can/CANMsgMap.h
    can/generated_${YEAR}/uwrt_mars_rover_can_wrapper.cpp
    # can/generated_${YEAR}/uwrt_mars_rover_can_wrapper.h
    can/generated_${YEAR}/uwrt_mars_rover_can.c
    # can/generated_${YEAR}/uwrt_mars_rover_can.h
    # can/generated_${YEAR}/uwrt_mars_rover_can_enums.h
    )

target_include_directories(${PROJECT_NAME}_lib PUBLIC
    include/uwrt_mars_rover_utils
    can
    can/generated_${YEAR}
    )


ament_export_targets(${PROJECT_NAME}_lib HAS_LIBRARY_TARGET)

ament_export_include_directories(
    include
    include/uwrt_mars_rover_utils
    can
    can/generated_${YEAR}
)

install(TARGETS ${PROJECT_NAME}_lib
    EXPORT ${PROJECT_NAME}_lib
    RUNTIME DESTINATION lib
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    # INCLUDES DESTINATION include
    )


ament_package()

Here is the CMakeLists.txt that is consuming the library (uwrt_mars_rover_utilities package):

cmake_minimum_required(VERSION 3.8)
project(uwrt_mars_rover_utilities)

if (NOT CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 20)
endif ()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_components REQUIRED)
find_package(std_msgs REQUIRED)
find_package(uwrt_mars_rover_hw_bridge REQUIRED)

include_directories(include)

# add_subdirectory(lib/uwrt_mars_rover_hw_bridge)

add_library(${PROJECT_NAME} SHARED
    src/uwrt_can.cpp
    #src/uwrt_params.cpp
)

ament_target_dependencies(${PROJECT_NAME}
    rclcpp
    std_msgs
    rclcpp_components
    uwrt_mars_rover_hw_bridge
)

add_executable(uwrt_can_test_node src/uwrt_can_test_node.cpp)
ament_target_dependencies(uwrt_can_test_node
    rclcpp
    std_msgs
    rclcpp_components
    uwrt_mars_rover_hw_bridge
)

target_link_libraries(uwrt_can_test_node
    ${PROJECT_NAME}
)

target_link_libraries(${PROJECT_NAME}
    uwrt_mars_rover_hw_bridge::uwrt_mars_rover_hw_bridge_lib
)

install(TARGETS
    ${PROJECT_NAME}
    uwrt_can_test_node
    RUNTIME DESTINATION lib/${PROJECT_NAME}
    ARCHIVE DESTINATION lib/${PROJECT_NAME}
    LIBRARY DESTINATION lib/${PROJECT_NAME}
)

ament_export_include_directories(
    include
)

# ament_export_libraries(
#     uwrt_mars_rover_hw_bridge
# )

ament_export_dependencies(
    rclcpp
)

ament_package()

I was expecting both packages to build successfully without errors. However, I currently receive this error:

CMake Error in CMakeLists.txt:
  Target "uwrt_mars_rover_hw_bridge_lib" INTERFACE_INCLUDE_DIRECTORIES
  property contains path:

    "/home/colin/uwrt_ws/src/uwrt_mars_rover_hw_bridge/include/uwrt_mars_rover_utils"

  which is prefixed in the source directory.


CMake Error in CMakeLists.txt:
  Target "uwrt_mars_rover_hw_bridge_lib" INTERFACE_INCLUDE_DIRECTORIES
  property contains path:

    "/home/colin/uwrt_ws/src/uwrt_mars_rover_hw_bridge/can"

  which is prefixed in the source directory.


CMake Error in CMakeLists.txt:
  Target "uwrt_mars_rover_hw_bridge_lib" INTERFACE_INCLUDE_DIRECTORIES
  property contains path:

    "/home/colin/uwrt_ws/src/uwrt_mars_rover_hw_bridge/can/generated_2021"

  which is prefixed in the source directory.

I can attempt to rearrange the directory structure but as I mentioned before, I did not create this package originally so I would prefer to leave it as is. If anyone can point out an error in my CMake files that can help resolve the problem, I would greatly appreciate it!

cwt1078
  • 25
  • 4
  • When `install` and EXPORT a target, you almost always need to use `$` and `$` when fill its include directories. See [duplicate question](https://stackoverflow.com/questions/25676277/cmake-target-include-directories-prints-an-error-when-i-try-to-add-the-source) and its answers for more details. – Tsyvarev Feb 05 '23 at 18:52

0 Answers0