common-lisp - 如何从 cffi:list-foreign-libraries 获取外国库的绝对路径?
问题描述
假设我想创建 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*
,但据我所知,没有可移植的方法来检索从中加载的库的路径。
推荐阅读
- python - python中的字典编码
- flutter - 如何在 Flutter 中的图像上实现 DropShadow / 阴影效果?
- c++ - 为什么我的 protobuf 反序列化给出了空的有效载荷?
- eigen3 - Eigen::Matrix 模数无法编译
- saml - OpenAM 如何验证来自 IDP 的 SAML 响应
- javascript - 如何在javascript中的30个数组之后用空格分割字符串?
- python - 如何组织包含产品和用户的数据库?
- javascript - 如何检查 input.value 是否与随机数相同
- python - TensorFlow 和 Keras 有什么区别?
- node.js - angular-cli ng 无法创建新项目:Err No matching version found for @angular/cli@~0.0.0