После некоторого исследования выясняется, что после загрузки библиотеки слот pathname
экземпляра foreign-library
, представляющего библиотеку, изменяется для указания пути к разрешенному объектному файлу, , но он является абсолютным только тогда, когдафайл не находится в стандартном системном расположении .Например:
(cffi:list-foreign-libraries :loaded-only t)
=> (#<CFFI:FOREIGN-LIBRARY LIBSDL2 "libSDL2-2.0.so.0"> ...)
Теперь это просто вопрос доступа к слоту пути:
(mapcar #'cffi:foreign-library-pathname *)
=> (#P"libSDL2-2.0.so.0" ...)
Но здесь вы можете видеть, что путь не является абсолютным.Это потому, что когда CFFI внутренне вызвал cffi::%load-foreign-library
(после небольшой трассировки) со следующими аргументами:
(cffi::%load-foreign-library "libSDL2-2.0.so.0" "libSDL2-2.0.so.0")
... и реализация нашла объектный файл, используя неявный механизм поиска системы (например, dlopen
).
cffi::%load-foreign-library
реализован по-разному на разных платформах, и в случае SBCL, например, указатель, полученный с помощью dlopen
, хранится в объектах внутри SB-SYS:*SHARED-OBJECTS*
, но насколько язнаю, что нет переносимого способа получить путь загрузки библиотеки из этого.