假设我想创建 Common Lisp 应用程序中使用的当前动态库的转储。鉴于cffi:list-foreign-libraries的结果,我如何获得外国图书馆的绝对路径?
如果给定的解决方案可以在操作系统方面或至少在 CL 实现方面具有可移植性,那就太好了。
假设我想创建 Common Lisp 应用程序中使用的当前动态库的转储。鉴于cffi:list-foreign-libraries的结果,我如何获得外国图书馆的绝对路径?
如果给定的解决方案可以在操作系统方面或至少在 CL 实现方面具有可移植性,那就太好了。
经过一番调查,似乎一旦加载了一个库,代表该库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*
,但据我所知,没有可移植的方法来检索从中加载的库的路径。