如何从cffi:list-foreign-libraries获取国外库的绝对路径?
How to get the absolute paths of foreign libraries from cffi:list-foreign-libraries?
假设我想创建一个 Common Lisp 应用程序中使用的当前动态库的转储。给定 cffi:list-foreign-libraries?
的结果,如何获取国外库的绝对路径
如果给定的解决方案可以在操作系统方面或至少在 CL 实现方面是可移植的,那就太好了。
经过一些调查,似乎一旦加载库,代表库的 foreign-library
实例的 pathname
槽被修改为指向已解析目标文件的路径,但只有当文件不在标准系统位置时它才是绝对的。例如:
(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*
里面的对象中,但是到目前为止据我所知,没有可移植的方法来检索从中加载的库的路径。
假设我想创建一个 Common Lisp 应用程序中使用的当前动态库的转储。给定 cffi:list-foreign-libraries?
的结果,如何获取国外库的绝对路径如果给定的解决方案可以在操作系统方面或至少在 CL 实现方面是可移植的,那就太好了。
经过一些调查,似乎一旦加载库,代表库的 foreign-library
实例的 pathname
槽被修改为指向已解析目标文件的路径,但只有当文件不在标准系统位置时它才是绝对的。例如:
(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*
里面的对象中,但是到目前为止据我所知,没有可移植的方法来检索从中加载的库的路径。