首页 > 解决方案 > 如何从 cffi:list-foreign-libraries 获取外国库的绝对路径?

问题描述

假设我想创建 Common Lisp 应用程序中使用的当前动态库的转储。鉴于cffi:list-foreign-libraries的结果,我如何获得外国图书馆的绝对路径?

如果给定的解决方案可以在操作系统方面或至少在 CL 实现方面具有可移植性,那就太好了。

例子

标签: common-lispcffi

解决方案


经过一番调查,似乎一旦加载了一个库,代表该库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*,但据我所知,没有可移植的方法来检索从中加载的库的路径。


推荐阅读