2011/11/18 Alexander Neundorf <span dir="ltr"><<a href="mailto:a.neundorf-work@gmx.net">a.neundorf-work@gmx.net</a>></span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="HOEnZb"><div class="h5">On Friday 18 November 2011, James Bigler wrote:<br>
> I thought CMake knew how to not drag all the dependent libraries once you<br>
> linked an executable module.<br>
><br>
> add_library(A STATIC a.cpp)<br>
> add_library(B SHARED b.cpp)<br>
> target_link_libraries(B A)<br>
> add_library(C SHARED c.cpp)<br>
> target_link_libraries(C B)<br>
><br>
> add_executable(run run.cpp)<br>
> target_link_libraries(run C)<br>
><br>
> At this point I'm seeing that C links against B and A when I think it<br>
> should only link against B since A shouldn't be needed to link against B.<br>
> In addition when compiling run, it links against B and A.<br>
><br>
> /usr/bin/c++ -dynamiclib -Wl,-headerpad_max_install_names -o libC.dylib<br>
> -install_name /Users/jbigler/tmp/code/cmake/translinking/build/libC.dylib<br>
> CMakeFiles/C.dir/c.cpp.o libB.dylib libA.a<br>
> /usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names<br>
> CMakeFiles/run.dir/run.cpp.o -o run libC.dylib libB.dylib libA.a<br>
><br>
> Is this the expected behavior?<br>
<br>
</div></div>Yes.<br>
If you want to limit this, use target_link_libraries( C<br>
LINK_INTERFACE_LIBRARIES ... ), with this you can specify the transitively<br>
linked libraries when linking against C.<br>
<br>
Alex<br>
</blockquote></div><br>OK, so propagating the libraries is the default behavior. I tried to use LINK_INTERFACE_LIBRARIES, but it only seemed to work for static libraries:<br><br>add_library(A STATIC a.cpp)<br>add_library(B SHARED b.cpp)<br>
target_link_libraries(B A)<br>target_link_libraries(B LINK_INTERFACE_LIBRARIES)<br>add_library(C SHARED c.cpp)<br>target_link_libraries(C B)<br>target_link_libraries(C LINK_INTERFACE_LIBRARIES)<br><br>add_executable(run run.cpp)<br>
target_link_libraries(run C)<br><br>During build:<br><br>Build B (this is fine)<br>/usr/bin/c++ -dynamiclib -o libB.dylib CMakeFiles/B.dir/b.cpp.o libA.a<br>Build C (this is fine too, no A in the list)<br>/usr/bin/c++ -dynamiclib -o libC.dylib CMakeFiles/C.dir/c.cpp.o libB.dylib<br>
Build run (this is weird, it linked both B and C)<br>/usr/bin/c++ CMakeFiles/run.dir/run.cpp.o -o run libC.dylib libB.dylib<br><br>Did I specify something wrong or does this property only consider static libraries?<br>