clsql проблема в SBCL

Я пытаюсь заставить работать clsql (раньше использовал cl-mysql, но смотрю на альтернативы). Просто пытаюсь поиграть на этом этапе, и я останавливаюсь на connect

(connect '("localhost" "test" "user" "password") :database-type :mysql)

получает меня

erred while invoking #<COMPILE-OP (:VERBOSE NIL) {BDFF0B9}> on
#<CLSQL-UFFI-SOURCE-FILE "clsql-uffi" "uffi" "clsql_uffi">
   [Condition of type ASDF:OPERATION-ERROR]

Backtrace:
  0: ((SB-PCL::FAST-METHOD ASDF:PERFORM (ASDF:COMPILE-OP CLSQL-UFFI-SYSTEM::CLSQL-UFFI-SOURCE-FILE)) ..)
  1: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1.)) ..)
  2: ((LAMBDA ()))
  3: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK))
  4: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]324))
  5: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..)
  6: ((FLET SB-C::WITH-IT))
  7: ((SB-PCL::FAST-METHOD ASDF:OPERATE (T T)) #<unavailable argument> #<unavailable argument> ASDF:LOAD-OP :CLSQL-MYSQL)[:EXTERNAL]
  8: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) ..)
  9: (CONNECT ("localhost" "test" "user" "password"))[:EXTERNAL]
 10: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CONNECT '("localhost" "test" "user" "password") :DATABASE-TYPE :MYSQL) #<NULL-LEXENV>)
 11: ((LAMBDA ()))
 --more--

Если я буду следовать accept перезагружается (обрезано выше для краткости) на всем пути, в конце концов я получаю

Attempt to call an undefined alien function.
   [Condition of type SB-KERNEL::UNDEFINED-ALIEN-FUNCTION-ERROR]

Restarts:
 0: [RETRY] Retry SLIME interactive evaluation request.
 1: [ABORT] Return to SLIME's top level.
 2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "worker" RUNNING {BD63789}>)

Backtrace:
  0: (SB-KERNEL::UNDEFINED-ALIEN-FUNCTION-ERROR)
  1: ("foreign function: #x806774B")
  2: ("foreign function: #x8052F2D")
  3: ("foreign function: #x80565C9")
  4: ((SB-PCL::FAST-METHOD CLSQL-SYS:DATABASE-CONNECT (T (EQL :MYSQL))) #<unavailable argument> #<unavailable argument> ("localhost" "test" "user" "password") :MYSQL)
  5: (CONNECT ("localhost" "test" "user" "password"))[:EXTERNAL]
  6: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CONNECT '("localhost" "test" "user" "password") :DATABASE-TYPE :MYSQL) #<NULL-LEXENV>)
  7: ((LAMBDA ()))
 --more--

Я использую SBCL 1.0.40.0, Debian 6.0, clsql был установлен с помощью quicklisp и mysql v14.14 (хотя я сомневаюсь, что это проблема с mysql).

2 ответа

Решение

Оказывается, я должен был сделать

apt-get install cl-sql

Это было необходимо, несмотря на то, что у меня уже было libmysqlclient-dev и был установлен clsql через quicklisp (который выглядел так, как будто у него были все правильные c-файлы). После этого я смог подключиться к локальному серверу MySQL, используя

(connect '("localhost" "test" "user" "password") :database-type :mysql)

Как примечание, это все еще выдало пару предупреждений на моей 64-разрядной системе (никаких проблем на моей 32-разрядной машине); с использованием accept рестарт (извините, Xach) получил его в кажущемся рабочем состоянии.

Я понятия не имею, как, в деталях, это решило проблему; если кто-то может это объяснить, ответьте, и я проголосую + приму (при условии, что ваше объяснение правильное).

РЕДАКТИРОВАТЬ: Подобные проблемы на другой машине меня разочаровал около 30 минут. Кажется, что это должно быть принято, но если вы строите систему из чистого металла, убедитесь, что вы установилиgcc, Если вы этого не сделаете, это мешает clsql-uffi от компиляции его компонентов по понятным причинам. Когда процесс завершается неудачно, вы получаете ту же ошибку компиляции, что и в вопросе, так что прикрывайте свои базы.

Не используйте accept запустить снова. Это означает: "Продолжайте, даже если что-то напортачило", и это редко, если вообще, то, что вы хотите сделать.

У вас установлены библиотеки разработки mysql? У вас есть libmysqlclient.so?

Одна вещь, чтобы попробовать: запустить новый sbcl и быстро загрузить "clsql-uffi", а затем проследить clsql-uffi::find-and-load-foreign-library, затем (clsql:connect nil :database-type 'mysql) чтобы узнать, находит ли он то, что вам нужно, основываясь на результатах трассировки.

Другие вопросы по тегам