[CMake] still having rpath problems on osx

Boudewijn Rempt boud at valdyas.org
Mon Dec 21 13:26:55 EST 2015


I'm still having rpath problems when creating libraries on OSX... And I'm not sure what's going on here. Here's the output for a single library:

otool -L ../i/lib/libkritaimage.dylib 
../i/lib/libkritaimage.dylib:
     /Users/boud/dev/i/lib/libkritaimage.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libkritawidgets.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libkritapsd.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
     @rpath/libImath.12.dylib (compatibility version 12.0.0, current version 12.0.0)
     @rpath/libIlmImf.22.dylib (compatibility version 22.0.0, current version 22.0.0)
     @rpath/libIex.12.dylib (compatibility version 12.0.0, current version 12.0.0)
     @rpath/libHalf.12.dylib (compatibility version 12.0.0, current version 12.0.0)
     @rpath/libIlmThread.12.dylib (compatibility version 12.0.0, current version 12.0.0)
     /Users/boud/dev/i/lib/libfftw3.3.dylib (compatibility version 8.0.0, current version 8.4.0)
     @rpath/libgsl.dylib (compatibility version 0.0.0, current version 0.0.0)
     /Users/boud/dev/i/lib/libkritaflake.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libkritaodf.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libkritaversion.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libkritastore.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libKF5Archive.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     /Users/boud/dev/i/lib/libkritaundo2.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libkritawidgetutils.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libKF5ItemViews.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     @rpath/QtPrintSupport.framework/Versions/5/QtPrintSupport (compatibility version 5.6.0, current version 5.6.0)
     /Users/boud/dev/i/lib/libKF5GuiAddons.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     /Users/boud/dev/i/lib/libKF5Completion.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     /Users/boud/dev/i/lib/libKF5ConfigGui.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     /Users/boud/dev/i/lib/libKF5WidgetsAddons.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     /Users/boud/dev/i/lib/libkritaglobal.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     @rpath/QtConcurrent.framework/Versions/5/QtConcurrent (compatibility version 5.6.0, current version 5.6.0)
     @rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.6.0, current version 5.6.0)
     /Users/boud/dev/i/lib/libkritapigment.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     @rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.6.0, current version 5.6.0)
     @rpath/QtXml.framework/Versions/5/QtXml (compatibility version 5.6.0, current version 5.6.0)
     /Users/boud/dev/i/lib/libkritaplugin.15.dylib (compatibility version 15.0.0, current version 15.0.0)
     /Users/boud/dev/i/lib/libKF5CoreAddons.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     /Users/boud/dev/i/lib/libKF5ConfigCore.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     /Users/boud/dev/i/lib/libKF5I18n.5.dylib (compatibility version 5.0.0, current version 5.17.0)
     @rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.6.0, current version 5.6.0)
     /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)

All libraries I link to are built. Some come with a cmake build system, some with an automake build system, boost with something else altogether... But I wouldn't have expected the way a library is built to make a difference for the link lines in the library that links to the other library.

Obviously,
      libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
is wrong -- it's got neither an @rpath, nor a full path.

I'm not sure even why some libraries are linked to with @rpath and others with a 
full path after running a make install, but I cannot figure out why libboost_system
doesn't have anything.

libkritaimage is build with these settings:

* CMake is version 3.4.0

* Policy CMP0042 is set to NEW

* in the toplevel cmakelists.txt, there's

if (APPLE)
     set(CMAKE_MACOSX_RPATH ON)
     SET(CMAKE_SKIP_BUILD_RPATH TRUE)
     SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
     SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif ()

I'm feeling dense, but I just cannot make out the documentation for these variables... CMAKE_INSTALL_RPATH_USE_LINK_PATH sounds like it should change the rpath on doing making install, but apparently that doesn't happen.

* And for the library itself, I explicitly set:

if (APPLE)
     set_target_properties(kritaimage PROPERTIES INSTALL_RPATH "@loader_path/../../../../lib;@loader_path/../lib;@loader_path/../Frameworks;@executable_path/../lib;@executable_path/../Frameworks")
endif()

Though I sort of feel that it shouldn't be necessary to explicitly set an rpath to something I build. But it results in:

otool -l libkritaimage.dylib

Load command 48
           cmd LC_RPATH
       cmdsize 48
          path @loader_path/../../../../lib (offset 12)
Load command 49
           cmd LC_RPATH
       cmdsize 32
          path @loader_path/../lib (offset 12)
Load command 50
           cmd LC_RPATH
       cmdsize 40
          path @loader_path/../Frameworks (offset 12)
Load command 51
           cmd LC_RPATH
       cmdsize 40
          path @executable_path/../lib (offset 12)
Load command 52
           cmd LC_RPATH
       cmdsize 48
          path @executable_path/../Frameworks (offset 12)

and since everything gets installed to lib, the secodn LC_RPATH points to the place where the library is really installed.

So I have to manually do

install_name_tool -change /Users/boud/dev/i/lib/libboost_system.dylib @rpath/libboost_system.dylib libkritaimage.dylib

to make the libkritaimage finr libboost_system -- and that just cannot be right...

-- 
Boudewijn Rempt | http://www.krita.org, http://www.valdyas.org


More information about the CMake mailing list