[CMake] Dependencies between libraries

Peter Eastman peastman at stanford.edu
Fri Mar 23 14:24:19 EDT 2012


My project involves a set of plugin libraries.  Those libraries get loaded dynamically at runtime, e.g. by calling dlopen().  The user can install them to any location they want, so the directory won't necessarily be in the library path.  I can safely assume, though, that they'll all be in the same directory.

Sometimes, one plugin directly depends on another plugin, and uses symbols defined in it.  That means that when I dlopen() the first plugin, it needs to locate the second one (which is in the same directory) or loading will fail.

On Linux, this seems to "just work".  Presumably this is because the directory containing a library is one of the default locations searched for other libraries it depends on?

On Mac OS it doesn't work.  It can be made to work, though, by using install_name_tool to specify @loader_path as the location of the dependent library.  I'm trying to get my CMake script to do this.  I've added the following line:

INSTALL(CODE "EXECUTE_PROCESS(COMMAND install_name_tool -change libOpenMMOpenCL.dylib @loader_path/libOpenMMOpenCL.dylib ${CMAKE_INSTALL_PREFIX}/lib/plugins/libOpenMMRPMDOpenCL.dylib)")

This appears to execute correctly.  To verify that it worked, I add the following line immediately after that:

INSTALL(CODE "EXECUTE_PROCESS(COMMAND otool -L ${CMAKE_INSTALL_PREFIX}/lib/plugins/libOpenMMRPMDOpenCL.dylib)")

So I first run install_name_tool to edit the path in the library, then run otool to print out the changed path.  That verifies that yes, the library really does contain the right path.

But at some later point in the build process, it's getting changed back again.  I don't know where or why, but once the build finishes running, otool shows that the @loader_path/ prefix has been removed again.  How can I prevent this from happening?

I haven't even begun looking into how to make things work on Windows, but if anyone has suggestions on that, I'll be very grateful for those too!

Peter


More information about the CMake mailing list