ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Creating a .so library that depends on message headers

asked 2014-06-26 23:54:45 -0500

bjem85 gravatar image

updated 2022-01-22 16:16:28 -0500

Evgeny gravatar image


I am trying to create a library that depends on header files generated by a call to generate_messages(). The message list is:


add_message_files( FILES hydraulic_arm.msg valve_command.msg valve_command_info.msg angular_rate_info.msg slope_info.msg accel_info.msg )

The library call is add_library(o22pac src/o22pac/o22pac.cpp). This sometimes works and sometimes doesn't depending on the exact order in which the message header files are generated.

What I need is a list variable that does into the add_library() call that lists the files. Using ${PROJECT_NAME}_generate_message_cpp (such as for add_dependencies()) does NOT work as it does not generate a list of header file names.

I could create my own list of headers, but that seems like a monumental waste of time an effort, source of bugs and misconfiguration and violation of the 'DRY' (don't repeat yourself) principle since catkin_make and cmake should already be aware of what headers the .msg files generate.

Is there a variable generated by catkin that represents a list of the header files by name? My searches of the documentation have found nothing promising.

Thanks, Bart

edit retag flag offensive close merge delete


bvbdort gravatar image bvbdort  ( 2014-06-27 03:08:37 -0500 )edit

I did see this answer, but it is talking about adding executables, not adding libraries.

bjem85 gravatar image bjem85  ( 2014-06-29 17:20:26 -0500 )edit

1 Answer

Sort by ยป oldest newest most voted

answered 2014-06-29 17:24:13 -0500

bjem85 gravatar image

The answer is that you have to add the add_dependencies() call after the add_library() call.

Unfortunately a lot of frustration was caused by the fact that neither the documentation at: or states this explicitly.

edit flag offensive delete link more


I may be biased here, but doesn't that just 'make sense'? It seems logical to me that you can only configure dependencies for a target that has already been declared, similar to how one can only assign a value to a variable that has been declared before (in C++) fi.

gvdhoorn gravatar image gvdhoorn  ( 2014-06-30 02:04:56 -0500 )edit

You're not wrong, but it depends on what you consider to make sense. Note that order of declaration of targets and dependencies doesn't matter in this way in all build systems, in particular `make`: you can declare targets and dependencies in any order in the `Makefile` and `make` will work it out.

bjem85 gravatar image bjem85  ( 2014-06-30 05:16:47 -0500 )edit

True. Perhaps the documentation could be improved. Have you considered submitting an issue to the catkin Github repository? Also, @joq could perhaps add a note to his -- excellent -- catkin tutorials?

gvdhoorn gravatar image gvdhoorn  ( 2014-06-30 06:31:52 -0500 )edit

I agree that the docs should not assume everyone knowns CMake well. If you can suggest where information should be added, I will make the update. Here, perhaps? ?

joq gravatar image joq  ( 2014-06-30 09:47:26 -0500 )edit
joq gravatar image joq  ( 2014-06-30 09:50:15 -0500 )edit

@joq: seems it is indeed. Perhaps the wording of the text could be improved a bit by emphasizing the importance of the order of the statements?

gvdhoorn gravatar image gvdhoorn  ( 2014-06-30 14:48:18 -0500 )edit

Yes. Just wanted to make sure adding it there would resolve this problem.

joq gravatar image joq  ( 2014-06-30 15:46:41 -0500 )edit

Question Tools

1 follower


Asked: 2014-06-26 23:54:45 -0500

Seen: 670 times

Last updated: Jun 29 '14