Jim Newton
6/16/2015 12:12:00 PM
I'm trying to figure out why dlopen() cannot find my .dylib file.
I looked in the documentation of cffi, but I didn't see the explanation of how the
search path is treated as far as recursive search is concerned.
I get the following error when trying to load my system. It would be great if someone
could give me some insight into how this is supposed to work.
debugger invoked on a CFFI:LOAD-FOREIGN-LIBRARY-ERROR:
Unable to load foreign library (LIB-MAGICK-WAND).
Error opening shared object "libMagickWand.dylib":
dlopen(libMagickWand.dylib, 10): image not found.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
Indeed libMagickWand.dylib does exist, but is in a strange place.
csh> ls -l /usr/local/Cellar/imagemagick/6.9.1-4/lib/*.dylib
-r--r--r-- 1 jnewton staff 500428 Jun 16 12:01 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagick++-6.Q16.6.dylib
lrwxr-xr-x 1 jnewton staff 25 Jun 3 13:38 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagick++-6.Q16.dylib -> libMagick++-6.Q16.6.dylib
lrwxr-xr-x 1 jnewton staff 25 Jun 16 13:33 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagick++.dylib -> libMagick++-6.Q16.6.dylib
-r--r--r-- 1 jnewton staff 1679688 Jun 16 12:01 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagickCore-6.Q16.2.dylib
lrwxr-xr-x 1 jnewton staff 27 Jun 3 13:38 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagickCore-6.Q16.dylib -> libMagickCore-6.Q16.2.dylib
lrwxr-xr-x 1 jnewton staff 27 Jun 16 13:34 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagickCore.dylib -> libMagickCore-6.Q16.2.dylib
-r--r--r-- 1 jnewton staff 1070632 Jun 16 12:01 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagickWand-6.Q16.2.dylib
lrwxr-xr-x 1 jnewton staff 27 Jun 3 13:38 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagickWand-6.Q16.dylib -> libMagickWand-6.Q16.2.dylib
lrwxr-xr-x 1 jnewton staff 27 Jun 16 13:34 /usr/local/Cellar/imagemagick/6.9.1-4/lib/libMagickWand.dylib -> libMagickWand-6.Q16.2.dylib
csh>
The default value of cffi:*foreign-library-directories* inside my lisp image is the following:
( (CFFI::EXPLODE-PATH-ENVIRONMENT-VARIABLE "LD_LIBRARY_PATH")
(CFFI::EXPLODE-PATH-ENVIRONMENT-VARIABLE "DYLD_LIBRARY_PATH") (UIOP/OS:GETCWD)
(CFFI::DARWIN-FALLBACK-LIBRARY-PATH))
But even if I push /usr/local/Cellar/ onto the list, I still get the same error from dlopen().
(#P"/usr/local/Cellar/"
(CFFI::EXPLODE-PATH-ENVIRONMENT-VARIABLE "LD_LIBRARY_PATH")
(CFFI::EXPLODE-PATH-ENVIRONMENT-VARIABLE "DYLD_LIBRARY_PATH") (UIOP/OS:GETCWD)
(CFFI::DARWIN-FALLBACK-LIBRARY-PATH))