2016-10-05 3 views
3

До сих пор я не смог построить свой Common Lisp проект в исполняемый с SbCl так:Common Lisp: исполняемый и разделяемая библиотека C

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

Кроме того, я сделал это для вызова функций C , скомпилированный в общую библиотеку, из общего lisp; что-то вроде этого:

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

(cffi:use-foreign-library libtest) 

или использование абсолютного пути для библиотеки. Для исполняемого файла требуется общая библиотека libtest.so. У меня есть как myexecutable, так и libtest.so в том же каталоге. Однако, если я использую абсолютное значение, я не могу распространять эти два файла. Если я использую «./libtest», он не находит библиотеку при запуске из другого каталога.

Каков подход для этого случая? Спасибо заранее!

+0

Почему вы не можете перераспределить его использовать абсолютный путь? –

+0

Предположим, я ввел «/ home/me/src/my-project», и я пишу в файле lisp. Когда я распространяю два файла, как-то файл lisp должен обновляться с учетом нового пути. Как мне это достичь? – Dimitris

+0

Хотя я думаю, что библиотеки обычно помещаются в одно системное расположение (например, '/ usr/lib' на linux), почему вы не можете использовать относительный путь? –

ответ

5

Нечто вроде 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" 
+0

Большое спасибо! Это то, что я искал. – Dimitris