[CMake] make target export file follow symlinks (or something better?)
Nico Schlömer
nico.schloemer at gmail.com
Sat Aug 23 09:51:18 EDT 2014
Hi,
thanks for your concise reply!
> The only exception would be if your mylib does not expose any of the API
> that hdf5 provides and a user of mylib does not need to know or care that
> you're using hdf5.
That is exactly my use case.
> In that case you should drop that library from your public link interface.
Right, it should not be INTERFACE_LINK_LIBRARIES but LINK_LIBRARIES
[1]. The reason why I do need to have the link libraries is
> (at least for shared libraries).
exactly that: static libs.
How do I get LINK_LIBRARIES instead of INTERFACE_LINK_LIBRARIES in the
target file?
--Nico
[1] http://www.cmake.org/cmake/help/v3.0/prop_tgt/LINK_LIBRARIES.html
On Sat, Aug 23, 2014 at 11:01 AM, Andreas Pakulat <apaku at gmx.de> wrote:
> Hi,
>
> On Sat, Aug 23, 2014 at 8:12 AM, Nico Schlömer <nico.schloemer at gmail.com>
> wrote:
>>
>> Hi all,
>>
>> I'm linking my shared library against
>> ```
>> /usr/lib/x86_64-linux-gnu/libhdf5.so -> libhdf5.so.7.0.0
>> /usr/lib/x86_64-linux-gnu/libhdf5.so.7 -> libhdf5.so.7.0.0
>> /usr/lib/x86_64-linux-gnu/libhdf5.so.7.0.0
>> ```
>> resulting in the dynamic dependency
>> ```
>> $ ldd mylib.so.1.0.0 | grep hdf5
>> libhdf5.so.7 => /usr/lib/x86_64-linux-gnu/libhdf5.so.7
>> (0x00007f50179e2000)
>> ```
>> The export file `mylibTargets.cmake` however lists
>> ```
>> set_target_properties(mylib PROPERTIES
>> INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
>> INTERFACE_LINK_LIBRARIES "/usr/lib/x86_64-linux-gnu/libhdf5.so"
>> )
>> ```
>> (without the so-version). This is not good since this symlink might
>> not be present when I configure a project against mylib. And it
>> doesn't have to be either:
>
>
> Actually it does have to be there (or rather it will be there).
>
>>
>> > All I need is
>> `/usr/lib/x86_64-linux-gnu/libhdf5.so.7` as specified by `ldd`.
>
>
> No, what you also need are the headers of that library, i.e. the
> 'development' part of the library installation. Since those development
> parts are usually mutually exclusively installable between different
> versions there's going to be only 1 installed. So the .so symlink will be
> there and hence the linking will work. If the symlink links to a different
> so-version the linker will abort when trying to link against mylib.
>
> The only exception would be if your mylib does not expose any of the API
> that hdf5 provides and a user of mylib does not need to know or care that
> you're using hdf5. In that case you should drop that library from your
> public link interface. That'll automatically drop the imported target in the
> export file, as the linker does not need to know what mylib links against
> when linking an app against mylib. (at least for shared libraries).
>
> Andreas
More information about the CMake
mailing list