[cmake-developers] Setting the link interface and dependencies in one command
Rolf Eike Beer
eike at sf-mail.de
Sat Oct 1 18:48:16 EDT 2011
On Sa., 1. Okt. 2011 18:40:09 CEST, Alexander Neundorf <neundorf at kde.org> wrote:
> If library bar internally uses symbols from foo,
> it needs to link against foo.
Correct.
> But if bar doesn't expose symbols from foo in its
> interface, and my executable hello links against bar, it doesn't also
> have to be linked against foo. This saves startup time and other things.
> Packagers also like that.
No, you got something wrong here. Packagers hate that. That's exactly the reason why e.g. Fedora and others introduced -Wl,no-unneeded (or how that's called) in their default linker flags.
If your hello needs foo and bar, and is only linked to bar because that one is already linked against foo, that your package will not work any longer if you replace foo 1.0 with foo 1.1 which is totally binary compatible but doesn't need foo internally any longer because your hello then misses symbols on startup. This is called unterlinking of hello and should be avoided whereever possible.
The opposite is overlinking and that was what I tried to avoid: my hello did not need any symbols from foo itself, so I wanted to get rid of them (which worked by forcing the implicit dependencies to empty). But CMake still did not want to allow me to export the bar target without also exporting foo even if the linkage to foo was only an internal detail and the user was not even allowed to use foo directly.
Eike
More information about the cmake-developers
mailing list