ROS Resources: Documentation | Support | Discussion Forum | Service Status | Q&A

Ament best practice for sharing libraries


What’s the recommended best practice for exporting a library from a package for use in another package?

My specific use case is exporting composable nodes as a shared libraries from some packages and using those in another package that does link-time composition, but I imagine this is going to be a common use case.

From poking around in the rclcpp CMakeLists.txt, this is what I’ve come up with. I’m not 100% sure about the purpose of the ament_export_dependencies lines, and I’m also assuming that I still need to manually install include files just like libraries since this seems the logical thing.




It works, but is it correct?


Yes, this will work. ament_export_libraries(...) is basically the equivalent to catkin_package(LIBRARIES ...).

A “better” / more modern way would be to generate a CMake file containing code to import the actual targets in downstream packages. This needs to steps:

  • install the generated file (example)
  • export the generated file (example)

The usage downstream is than also different: see example.

We only do this in very few cases yet but the goal is to use this approach in all packages.