[CMake] Shared, static and header-only versions of library side by side.

Kyle Edwards kyle.edwards at kitware.com
Mon Jul 8 10:00:20 EDT 2019


On Thu, 2019-07-04 at 00:25 +0300, Dmitry Igrishin wrote:
> Hello,
> 
> The libraries I developing can be used as a shared libraries, static
> libraries or header-only libraries.
> I want to let the users to:
>   - install all three variants side by side;
>   - choice what variant of library to use for linkage.
> I see 2 options here:
>   1. use different config files. For example, foo-config.cmake
> (corresponds to shared library "foo"), foo_static-config.cmake
> (corresponds to static library "foo"), foo_interface-config.cmake
> (corresponds to header-only library "foo"). In this case users can
> consume appropriate variant of "foo" by using find_package(foo
> CONFIGS
> <config>) and then target_link_libraries(bar foo) or
> target_link_libraries(bar foo_static) or target_link_libraries(bar
> INTERFACE foo_interface);
>   2. use different packages. For example, "foo", "foo_static",
> "for_interface". In this case users can consume libraries by using
> find_package(foo) or find_package(foo_static) or
> find_package(foo_interface) and then target_link_libraries(bar foo)
> or
> target_link_libraries(bar INTERFACE foo).
> 
> What option is preferable? Or is there are any other options
> available?

There is another option: create different targets, each with the same
output name. For example, you would find_package(foo), which would
yield targets foo_shared, foo_static, and foo_interface. You could then
use target_link_libraries() for each of these.

Keep in mind that they don't have to have foo_shared and foo_static in
their filenames. You can set the OUTPUT_NAME property on each target:

https://cmake.org/cmake/help/v3.15/prop_tgt/OUTPUT_NAME.html

This would allow them to still be called libfoo.a and libfoo.so.

Kyle


More information about the CMake mailing list