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!