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)
чтобы узнать, находит ли он то, что вам нужно, основываясь на результатах трассировки.