cmakedependency-managementtarget-link-libraries

When should I use CMake's add_dependencies instead of target_link_libraries?


I'm used to defining CMake target dependencies using the target_link_libraries() command. Recently, though, I've noticed the existence of another command, add_dependencies(). When should I use the latter rather than the former?

Note: I tried reading this question: target_link_libraries and add_dependencies - but the answers confused me. I understand I should not use both. But it's not entirely clear to me when I should use which.


Solution

  • add_dependencies should only be used where you need to establish a dependency in the build process that would otherwise not be present.

    If a you want to influence the linker options, you use target_link_libraries.

    For INTERFACE targets target_link_libraries should be used, even if it doesn't have an effect on the linker options. An example would be "linking" a header only library: This usually only results in include directories being inherited; you use target_link_libraries for this nonetheless.


    A notable example of using add_dependencies would be to make sure MODULE targets dynamically loaded by an executable target get built when building the executable.