【问题标题】:Adding a directory globally to cffi:*foreign-library-directories*将目录全局添加到 cffi:*foreign-library-directories*
【发布时间】:2020-03-11 19:52:25
【问题描述】:

我在 macOS 下使用 Nix 包管理器来安装我的大部分软件,包括动态库。我想让 CFFI 可以访问它们。这意味着添加到cffi:*foreign-library-directories* 的路径。很好,但是我该怎么做呢

  • 全局适用于我的系统(例如,应该适用于通过 Quicklisp 加载的包)

  • 每次启动都不加载CFFIsbcl

忽略第二个标准,我可以在~/.sbclrc中添加几行:

(ql:quickload "CFFI")
(pushnew (merge-pathnames ".nix-profile/lib/" (user-homedir-pathname))
         cffi:*foreign-library-directories*
         :test #'equal)

我正在寻找的是一种添加路径的方法 CFFI 加载之后。有点像 Emacs Lisp 中的 eval-after-load。这可能吗?

【问题讨论】:

  • 我对 nix 不太熟悉,但也许用 nix-env 加载 sbcl 可以设置环境,以便底层 dlopen 调用透明地工作?
  • 我确实通过 nix 安装了 sbcl,但这只是普通的 sbcl。 Nix(至少对于 macOS)似乎不包含任何为 sbcl 打包的 Lisp 库。虽然有许多名称以lisp- 开头的包,但也有其他 Lisp 实现。
  • 请注意,Nix 不是这里的核心问题。我还在/opt/brew 下使用 Homebrew 安装了库,这会导致同样的问题。

标签: common-lisp cffi


【解决方案1】:

我认为您应该尝试使用底层系统的机制,即。 e.在 Linux 上 ldconfig(分别为 ld.so.conf),在 MacOS 上 DYLD_LIBRARY_PATH。 CFFI 手册说,*foreign-library-directories* 仅在系统机制失败时用作备用。

【讨论】:

  • CFFI 手册没有提到支持环境变量,但至少在 SBCL/macOS 下,这确实有效。由于设置DYLD_LIBRARY_PATH很容易搞砸macOS系统,所以我决定只在.sbclrc这样做:(setf (uiop/os:getenv "DYLD_LIBRARY_PATH") (uiop:strcat (uiop/os:getenv "HOME") "/" ".nix-profile/lib/"))
猜你喜欢
  • 2021-01-23
  • 2016-05-26
  • 2010-10-08
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多