2011-02-17 31 views
2

我想获得clsql的工作(用于使用cl-mysql,但看着替代品)。只是试图在这一点上玩,而我在connect在SBCL clsql麻烦

(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

原来我不得不这样做尽管事实上,我已经有libmysqlclient-dev和已经安装clsql通过quicklisp(这看起来似乎与它所有正确的C文件)

apt-get install cl-sql 

这是必要的。这样做后,我能够连接到使用

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

作为一个说明本地MySQL服务器,它仍然扔(我的32位机器上没有问题)我的64位系统上的一些警告;使用accept重新启动(对不起,Xach)使其处于看似工作状态。

我不知道如何,详细地说,这解决了这个问题;如果有人能解释它,回答,我会upvote +接受(假设你的解释是正确的)。

编辑:在另一台机器上的类似问题让我感到沮丧约30分钟。这似乎应该假设,但如果您从裸机构建系统,请确保您安装gcc。如果你不这样做,它会阻止clsql-uffi编译其组件,原因很明显。当这个过程失败时,你会得到与问题中相同的编译错误,所以请覆盖你的基础。

+1

一般来说,Debian会以我感到困惑和难以排除故障的方式修改CL库。我使用Debian系统,但对于Lisp库和实现,我从上游或Quicklisp获取所有内容。不是一个真正的解释,对不起。 – Xach

2

请勿使用accept重新启动。它的意思是“即使有些事情搞砸了,也要继续下去”,而这很少,如果有的话你想做什么。

您是否安装了mysql开发库?你有libmysqlclient.so吗?

有一点需要尝试:启动一个新的sbcl并快速加载“clsql-uffi”,然后跟踪clsql-uffi::find-and-load-foreign-library,然后(clsql:connect nil :database-type 'mysql),根据跟踪输出查看是否找到您需要的内容。

+0

我安装了'libmysqlclient-dev','find -name libmysqlclient.so'在'/ usr/lib /'中返回匹配项。在干净的SBCL上Qckloading'clsql-uffi'失败,出现上面的错误(qickloading'uffi'成功,并且快速加载'clsql_uffi'给了我一个'System not found'错误。如果我尝试在'clsql-uffi'之后快速加载'clsql-uffi' 'clsql_uffi',它错误地告诉我'CLSQL-UFFI:ATOL64'是未定义的)。 – Inaimathi

+0

手动加载'clsql-uffi-loader.lisp'也会出错; '无法加载外部库“clsql_uffi”。 (搜索CLSQL-SYS:* FOREIGN-LIBRARY-SEARCH-PATHS *)'。 'CLSQL-SYS:* FOREIGN-LIBRARY-SEARCH-PATHS *'评估为'(#P“/ home/inaimathi/quicklisp/dists/quicklisp/software/clsql-20101207-git/uffi /”) ,并且该目录包含'clsql_uffi'文件'lib','c'和'dll')。我感觉我失去了一些小而明显的东西。 – Inaimathi