【问题标题】:Common Lisp: standalone executable and shared C libraryCommon Lisp:独立的可执行文件和共享的 C 库
【发布时间】:2016-10-05 22:14:58
【问题描述】:

直到现在,我已经成功地将我的 Common Lisp 项目构建成一个带有 sbcl 的独立可执行文件,如下所示:

(sb-ext:save-lisp-and-die "myexecutable" :toplevel #'main :executable t)

另外,我已经从 common lisp 调用 C 函数,编译到共享库中;像这样:

(cffi:define-foreign-library libtest
      (:unix (:default "./libtest"))
      (t (:default "./libtest")))

(cffi:use-foreign-library libtest)

或使用库的绝对路径。生成的可执行文件需要共享库 libtest.so。我在同一个目录中有 myexecutable 和 libtest.so 。但是,如果我使用绝对值,我将无法分发这两个文件。如果我使用“./libtest”,它在从另一个目录运行时找不到库。

这个案例的处理方法是什么? 提前谢谢!

【问题讨论】:

  • 为什么不能使用绝对路径重新分配它?
  • 假设我放入“/home/me/src/my-project”并写入lisp文件。当我分发这两个文件时,应该以某种方式使用新路径的知识更新 lisp 文件。我如何做到这一点?
  • 虽然我认为库通常放在一个系统范围的位置(例如,Linux 上的/usr/lib),但为什么不能只使用相对路径?
  • 你是对的。我可以将共享库放在系统范围的位置。但我在想像下面的答案。谢谢!

标签: shared-libraries common-lisp executable sbcl


【解决方案1】:

sb-ext:*runtime-pathname* 之类的东西应该会给你可执行文件的路径名。

* (describe '*runtime-pathname*)

SB-EXT:*RUNTIME-PATHNAME*
  [symbol]

*RUNTIME-PATHNAME* names a special variable:
  Value: #P"/usr/local/bin/sbcl"
  Documentation:
    The absolute pathname of the running SBCL runtime.

然后您可以计算同一目录中文件的路径名:

* (merge-pathnames "libtest" *runtime-pathname*)

#P"/usr/local/bin/libtest"

【讨论】:

  • 非常感谢!这就是我一直在寻找的。​​span>
猜你喜欢
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多