On 11/23/2011 10:25 AM, Alan W. Irwin wrote: > cmake-2.8.6 has the following documentation of the > LINK_INTERFACE_LIBRARIES property for targets: > > LINK_INTERFACE_LIBRARIES > List public interface libraries for a shared library or executable. > > By default linking to a shared library target transitively links to > targets with which the library itself was linked. For an executable > with exports (see the ENABLE_EXPORTS property) no default transitive > link dependencies are used. This property replaces the default > transitive link dependencies with an explicit list. When the target > is linked into another target the libraries listed (and recursively > their link interface libraries) will be provided to the other target > also. If the list is empty then no transitive link dependencies > will > be incorporated when this target is linked into another target > even if > the default set is non-empty. This property is ignored for STATIC > libraries. > > I believe the reference to executables above is just plain > wrong/misleading. For example, the FAQ states that > LINK_INTERFACE_LIBRARIES simply lists "the libraries that should be > transitively included in the link by CMake" with the clear implication > (also confirmed by experiment below) that this target property affects > _everything that links to the target whose property is being set_. > But nothing links to an executable so why are executables mentioned at > all?
That's not true. See the ENABLE_EXPORTS target property. [...] > > In sum, from this experiment it looks like I will have to set > LINK_INTERFACE_LIBRARIES to empty for all PLplot library targets that > depend on other library targets (e.g., B, C, D, and E, above, but _not_ > main or A) created by our build system to comprehensively turn off > transitive linking and avoid overlinking that rpmlint is complaining > about. Transitive linking is a tricky issue, especially if the new --no-copy-dt-needed-entries default is active which means that if you have e.g. a library A, a library B that links against A and an executable C that uses symbols from both, A and B but only directly links against B, you will get a linking error if --as-needed is enabled. However, CMake can't know for you whether C actually needs to be linked against A, so it takes the safe route. The alternative would be to not do it, but then you would need to explicitly link C against A. See http://wiki.debian.org/ToolChain/DSOLinking for more details. Michael -- 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://www.cmake.org/mailman/listinfo/cmake
