[CMake] absolute library path, sorry for the question
Andreas Naumann
Andreas-Naumann at gmx.net
Sat Dec 23 04:47:38 EST 2017
your problem is hard to analyse. If you have a "minimal" example, which
shows this behavior, we could test it. In your last mail, you wrote
about building and installing libtiff using your own libjpeg. But than
you write about a later build. So something must happen in the "later
build".
Interesting enough, you said, that with newer systems, you do not have
this problem. Do these old systems use a different cmake version?
Seasons Greetings,
Andreas
Am 22.12.2017 um 17:42 schrieb Mario Emmenlauer:
> Can anyone help to force cmake use absolute paths?
>
> On 13.12.2017 11:45, Mario Emmenlauer wrote:
>> Thank you for your reply!! Your explanation is very helpful for writing
>> my own CMakeLists.txt. But in my case, I use the standard CMakeLists.txt
>> that comes with the libraries. For example libtiff, turbojpeg, thrift,
>> and many others...
>>
>> As an example, I build libtiff in the following way:
>> cmake ../$TIFFVERSION \
>> -Wno-dev \
>> -G"Unix Makefiles" \
>> -DCMAKE_PREFIX_PATH="$THIRDPARTYTARGETDIR" \
>> -DCMAKE_INSTALL_PREFIX="$THIRDPARTYTARGETDIR" \
>> -DCMAKE_BUILD_TYPE="Release" \
>> -DBUILD_SHARED_LIBS="ON" \
>> -Djpeg="ON" \
>> -DJPEG_INCLUDE_DIR="$THIRDPARTYTARGETDIR/include" \
>> -DJPEG_LIBRARY="$THIRDPARTYTARGETDIR/lib/libjpeg.so" && \
>> make VERBOSE="1" && make install
>>
>> In the build log, I can see that cmake detects the jpeg library to be
>> '$THIRDPARTYTARGETDIR/lib/libjpeg.so'. However, in the later build, the
>> Makefile links with '-ljpeg' instead of '$THIRDPARTYTARGETDIR/lib/libjpeg.so'.
>> And this in turn will make 'ld' use '/usr/lib/x86_64-linux-gnu/libjpeg.so'
>> instead of my thirdparty libjpeg.
>>
>> So at some point between FindJPEG.cmake and the final Makefile, cmake
>> changed the JPEG_LIBRARIES variable from absolute to relative. And I can
>> not understand why or when this happens. The documentation also does not
>> help me, because it explains that this should happen 'if the full path is
>> not know or if the full path is one of the system library dirs' (see
>> https://cmake.org/pipermail/cmake/2015-September/061462.html). In my case,
>> I override to use jpeg with a known, existing path that is not a system
>> library.
>>
>> All the best,
>>
>> Mario
>>
>>
>>
>>
>> On 13.12.2017 11:12, Bo Zhou wrote:
>>> Hi
>>>
>>> CMAKE_SKIP_RPATH usually is used for the shared module which might want to have the customized distributed path such as within the application. According
>>> personal experience on POSIX systems (Linux, UNIX, OSX), always enable CMAKE_SKIP_RPATH for the all local shared dependencies, and to the final distribution,
>>> (if needed) put shared libraries into the lib folder of distribution.
>>>
>>> According your description, I'm not sure how did you pick up your library into the application from CMake, usually we have to make sure the CMake always chooses
>>> the libraries from 3rd-party directory not system or another places. In our system, it has a variable THIRDPARTY_DIR for command FIND_PATH() to locate the
>>> folder which contains the all built libraries, then use HINTS and NAMES in the command FIND_PATH() and FIND_LIBRARY() to locate the correct paths for the
>>> pre-built libraries, so the linking should be okay.
>>>
>>> If everything has no error, but just the application always picks up the system's library not the 3rd-party libraries we prepared, one solution would add
>>> another loader script for the application, from the loader script it appends the local lib folder to LD_LIBRARY_PATH, then launch the actual application
>>> executable file. A lot of commercial application on Linux solve the similar issue by this way.
>>>
>>> Wish my reply is helpful.
>>>
>>> Thank you very much.
>>>
>>> On Wed, Dec 13, 2017 at 6:06 PM, Mario Emmenlauer <mario at emmenlauer.de <mailto:mario at emmenlauer.de>> wrote:
>>>
>>>
>>> Dear cmake users,
>>>
>>> I have found good documentation on the cmake wiki about RPATH and
>>> its different variables, and also on the mailing lists. But somehow
>>> it still does not add up for me. Can you please help?
>>>
>>> I use cmake 3.9.5 on different platforms, CentOS 6 and Ubuntu 14.04
>>> amongst others. I build many standard libraries (like tiff and jpeg)
>>> into my own thirdparty directory, and set CMAKE_PREFIX_PATH to find
>>> them there. On newer Linux and Windows, cmake uses always the absolute
>>> path to those libraries, and everything works fine. But on older Linux
>>> like Ubuntu 14.04 and CentOS 6 it does not. cmake will first find the
>>> library in the correct absolute thirdparty directory, and I can confirm
>>> this by printing the 'XXX_LIBRARIES' variable in the find script. But
>>> later the Makefile will link with '-lxxx' instead of the full path.
>>> This makes 'ld' use the system library instead!
>>>
>>> I completely fail to understand at what point cmake changes XXX_LIBRARIES
>>> from an absolute path to '-lxxx', for example for libjpeg.
>>>
>>> I have experimented with CMAKE_SKIP_BUILD_RPATH, but it does not help.
>>> The only workaround I could find is to add the thirdparty directory to
>>> LDFLAGS. Then 'ld' will also find the correct library.
>>>
>>>
>>> Is this a bug, or an expected behavior? What parameters should I add
>>> when I invoke cmake so that it will always use libraries with their
>>> full path?
>>>
>>>
>>> Cheers,
>>>
>>> Mario Emmenlauer
>>>
>>>
>>>
>>> PS: since I build thirdparty libraries, I prefer not to change their
>>> CMakeLists.txt but would rather prefer to set better cmake command line
>>> parameters.
>>>
>>>
>>> References:
>>> https://cmake.org/Wiki/CMake_RPATH_handling <https://cmake.org/Wiki/CMake_RPATH_handling>
>>> https://cmake.org/pipermail/cmake/2015-September/061462.html <https://cmake.org/pipermail/cmake/2015-September/061462.html>
More information about the CMake
mailing list