CMake RPATH handling: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
No edit summary
(Replace content with link to new CMake community wiki)
 
(28 intermediate revisions by 8 users not shown)
Line 1: Line 1:
CMake gives the user complete control over the RPATH of executables and libraries created using CMake.
{{CMake/Template/Moved}}


==What is RPATH ?==
This page has moved [https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling here].
 
If an executable ''foo'' links to the shared library ''bar'', the library ''bar'' has to be found and loaded when the executable foo is executed. This is the job of the linker, under Linux this is usually ld.so.
The linker searches a set of directories for the library bar, which will under most UNIXes have the name "libbar.so".
The linker will search the libraries in the following directories in the given order:
 
* RPATH - a list of directories which is linked into the executable, supported on most UNIX systems
* LD_LIBRARY_PATH - an environment variable which holds a list of directories
* RUNPATH - same as RPATH, but searched ''after'' LD_LIBRARY_PATH, supported only on some newer UNIX systems, e.g. on most current Linux systems
* /etc/ld.so.conf - configuration file for ld.so which lists additional library directories
* builtin directories - basically /lib and /usr/lib
 
There are different reasons why search directories additonal to the builtin ones can be needed - a user may install a library privately into his home directory, e.g. ~/lib/, or there may be two or more versions of the same library installed, e.g. /opt/kde3/lib/libkdecore.so and /opt/kde4/lib/libkdecore.so.
 
For the first case it would work if the user would set LD_LIBRARY_PATH accordingly:
<pre>
export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH
</pre>
 
This will break for the second case, where for some programs /opt/kde3/lib has to be searched and for other applications /opt/kde4/lib has to be searched, but in no case both. The only way to have an executable-dependent library search path is by using RPATH (or RUNPATH, but this isn't supported everywhere).
 
==CMake and the RPATH==
 
With CMake the developer has full control over the RPATH of his executables and shared libraries. This is controlled over various target properties, see the documentation of SET_TARGET_PROPERTIES().

Latest revision as of 15:41, 30 April 2018


The CMake community Wiki has moved to the Kitware GitLab Instance.

This page has moved here.