Common Lisp:独立可执行文件和共享C库

Dim*_*ris 3 executable sbcl common-lisp shared-libraries

到目前为止,我已经设法将我的Common Lisp项目构建为sbcl的独立可执行文件,如下所示:

(sb-ext:save-lisp-and-die "myexecutable" :toplevel #'main :executable t)
Run Code Online (Sandbox Code Playgroud)

另外,我已经将它调用C语言函数,编译成共享库,来自常见的lisp; 这样的事情:

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

(cffi:use-foreign-library libtest)
Run Code Online (Sandbox Code Playgroud)

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

这种情况的方法是什么?先感谢您!

Rai*_*wig 7

类似的东西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.
Run Code Online (Sandbox Code Playgroud)

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

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

#P"/usr/local/bin/libtest"
Run Code Online (Sandbox Code Playgroud)