[CMake] Link against dynamic library

Michael Jackson mike.jackson at bluequartz.net
Fri Sep 25 09:29:32 EDT 2009


With CMake you can do something like:

  add_library(foo ....)

  add_executable( bar .. )
  target_link_libraries (bar foo)

and CMake will make sure all the link paths are correct. There  
generally should not be a need to set the "install_name" of built  
libraries _within_ a build tree.

  Now, setting the install_name for an installation is a different  
matter. If you are creating OS X .app bundles then you should look  
into CMake's "BundleUtilities" module that "fixes up" OS X .app  
bundles for self contained deployment.

If you are building libraries that you are installing onto your system  
to mimic an actual installation on another machine then I have the  
following bit of code in my CMakeLists.txt file for each library  
project:

IF (APPLE)
   OPTION (MXA_BUILD_WITH_INSTALL_NAME "Build Libraries with the  
install_name set to the installation prefix. This is good if you are  
going to run from the installation location" OFF)
   IF(MXA_BUILD_WITH_INSTALL_NAME)
       SET_TARGET_PROPERTIES(${MXADATAMODEL_LIB_NAME}
          PROPERTIES
          LINK_FLAGS "-current_version ${${PROJECT_NAME}_VERSION} - 
compatibility_version ${${PROJECT_NAME}_VERSION}"
          INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
          BUILD_WITH_INSTALL_RPATH ${MXA_BUILD_WITH_INSTALL_NAME}
       )
   ENDIF(MXA_BUILD_WITH_INSTALL_NAME)
ENDIF (APPLE)

  So when I want to do an actual install of the project somewhere else  
on my system I launch "ccmake" or cmake-gui.app and set the  
MXA_BUILD_WITH_INSTALL_NAME option to ON then do a "make install" and  
the makefiles that cmake generates will have the correct OS X  
'install_name' set for the particular CMAKE_INSTALL_PREFIX that was  
set during configuration.

Does any of that make sense?
_________________________________________________________
Mike Jackson                  mike.jackson at bluequartz.net
BlueQuartz Software                    www.bluequartz.net
Principal Software Engineer                  Dayton, Ohio

On Sep 25, 2009, at 7:28 AM, Eugen-Andrei Gavriloaie wrote:

> Hello,
>
> Is there any way to tell cmake to use relative paths when linking an  
> executable? Here some info about a sample exec:
>
> $ otool -L ./rtmpserver/rtmpserver
> ./rtmpserver/rtmpserver:
> 	/Users/shiretu/work/crtmpserver/trunk/builders/cmake/thelib/ 
> libthelib.dylib (compatibility version 0.0.0, current version 0.0.0)
> 	/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current  
> version 0.9.8)
> 	/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8,  
> current version 0.9.8)
> 	/Users/shiretu/work/crtmpserver/trunk/builders/cmake/common/ 
> libcommon.dylib (compatibility version 0.0.0, current version 0.0.0)
> 	/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current  
> version 7.9.0)
> 	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current  
> version 124.1.1)
>
>
> What I want is to transform
>
> /Users/shiretu/work/crtmpserver/trunk/builders/cmake/thelib/ 
> libthelib.dylib (compatibility version 0.0.0, current version 0.0.0)
>
> into
>
> thelib/libthelib.dylib (compatibility version 0.0.0, current version  
> 0.0.0)
>
> So, when I do
>
> TARGET_LINK_LIBRARIES(rtmpserver thelib.....) is there any way to  
> tell cmake to build the Makefile in such a way that the final  
> executable will have relative references to the used libraries?
>
> I only want to do that for the libraries in my project, not all of  
> them (ibSystem.B.dylib,libstdc++.6.dylib, etc) should remain the same
>
> Thank you
>
>
> _______________________________________________
> 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



More information about the CMake mailing list