2011-02-17 33 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