If I link foo.so to bar.so, do private shared library dependencies need to be found at compile time?

Issue

Using cmake language, say I create a target foo, and link it to libbar.so. libbar.so was already compiled on a different platform with a cmake PRIVATE depedency on libbaz.so. So the dependency chain is

foo ----> libbar --(PRIVATE)--> libbaz

Does libbaz.so need to be present on the system when I compile foo and link it with libbar? My understanding is that I can compile and link foo without libbaz, and then find libbaz at foos runtime on a different platform using LD_LIBRARY_PATH. In other words, my hunch is that libbaz is only a runtime, and not compile time dependency.

But my current design for a large build system is dependent on this hunch being correct, so I want to double check.

Solution

General linking by the compiler toolchain

In general it depends on how libbaz got linked to libbar.

If libbaz got statically linked when building libbar then there are no compile or runtime dependencies at build-time of foo to libbaz. This is due to the fact that statically linked code gets "copied" into the file that links it (when no special hacks or other dark magic is used).

If libbaz got dynamically linked when building libbar then libbaz is (only) a runtime dependency at build-time of foo.

final library linking middle library linking first library runtime dependencies
foo statically libbar statically libbaz none
foo statically libbar dynamically libbaz libbaz
foo dynamically libbar statically libbaz libbar
foo dynamically libbar dynamically libbaz libbar, libbaz

There is an exception. But it should not apply in your specified scenario. If libbar dynamically loads another library (like libbaz) via Windows-API LoadLibrary or Unix/Linux/…-API dlopen then the linker does not have any information about this dependency at build-time. In this case it is a dynamic runtime dependency by code.

Public / Private

In this case as you are using CMake it is a terminology of CMake. This is only meaningful when defining dependencies in CMake (mainly via target_link_libraries).

CMake target linking CMake target or library description
libbar private libbaz libbar gets libbaz’ includes, etc. at compile-time and as linking library at link-time.
libbar public libbaz libbar gets libbaz’ includes, etc. at compile-time and as linking library at link-time.
Libraries using libbar are also getting the interface portion of libbaz (interface includes, libs, etc.).
libbar interface libbaz libbar does not use libbaz at all.
Libraries using libbar are getting the interface portion of libbaz (interface includes, libs, etc.).

Answered By – Johnny_xy

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published