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

Reply via email to