On Oct 1, 2011, at 4:48 PM, Rolf Eike Beer wrote: > On Sa., 1. Okt. 2011 18:40:09 CEST, Alexander Neundorf <neund...@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.
Can you consider this example as a demonstration for why cmake wants information about foo in the exports file even though its an internal detail? project(test) set(CMAKE_SKIP_RPATH 1) add_library(foo SHARED test.cpp) set_target_properties(foo PROPERTIES LIBRARY_OUTPUT_DIRECTORY "foo") add_library(bar SHARED test.cpp) target_link_libraries(bar foo) set_target_properties(bar PROPERTIES LIBRARY_OUTPUT_DIRECTORY "bar" LINK_INTERFACE_LIBRARIES "") add_executable(baz test.cpp) # 1) link giving target name #target_link_libraries(baz bar) # 2) link giving the path to the library target_link_libraries(baz "${CMAKE_CURRENT_BINARY_DIR}/bar/libbar.so") If I do #2, I get a link warning /usr/bin/ld: warning: libfoo.so, needed by bar/libbar.so, not found (try using -rpath or -rpath-link) If I do #1, then I don't get that warning and if I turn on verbose output, I see that cmake wasn't linking foo into baz anyway. Apparently the linker wants to have a look at dependent shared libraries, and cmake is using the -rpath-link flag for that. This information is passed into the exports file, and cmake needs the dependent shared libraries for that. Clint -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers