Viva,
On 2/12/07, Luís Oliveira luismbo@gmail.com wrote:
On 12/02/07, Edgar Gonçalves edgar.goncalves@gmail.com wrote:
- Unlike AllegroCL or Lispworks, Clisp (and SBCL too, btw) requires me to
precede all defcfuns related to a library with:
#+clisp (cffi::use-foreign-library Tcl) (defcfun ("Tcl_FindExecutable" tcl-find-executable) :void (argv0 :string))
That doesn't sound right. You should only need to call (use-foreign-library tcl) only once, some time before you load your bindings.
Let me rephrase it a bit, to avoid misunderstandings. Yes, I call (use-foreign-library tcl) only once. The point is that I *need* to call it, whereas with ACL, for instance, I don't - the defcfuns just work for themselves.
- When I load the saved image (using the code from above), I get an error
when applying defcfun'ed functions, telling me the library wasn't found:
Just tested with GNU CLISP 2.41 (2006-10-13) on OSX. Loaded cffi-test, saved an image (tried with ":executable t" too), restarted with the image, and ran (rt:do-tests) and it works. (Except some funcall.* tests fail at first, for some reason. I blame it on some RT weirdness.)
AFAICT, CLISP correctly reloads the libraries at startup. Can you try this with cffi-test or otherwise provide some sort of test case?
Actually, I haven't tried tests, but I can't seem to get past the library bindings.lisp. It seems to be a problem with the dll (I'm running Windows 2003), given that my cl.exe (version 14.00.50727.42 for 80x86 ) won't recognize the <stdint.h>, and that my cygwin (latest, just checked for updates) makes a dll that hangs bindings.fas while loading.
As for a short test case, here's the smallest I can make that fires up my error. After loading clisp, and loading asdf, I eval:
,----- | (asdf:operate 'asdf:load-op :cffi) | | (cffi:define-foreign-library odbc | (:windows (:or "odbc32.dll")) | (t (:default "odbc32.dll"))) | | (cffi:defcfun ("SQLAllocHandle" sql-handle) :short) | | (sql-handle) `-----
The last form brings me to the following error: WARNING: FFI::FOREIGN-LIBRARY-FUNCTION: no dynamic object named "SQLAllocHandle" in library :DEFAULT *** - FUNCALL: undefined function NIL
with the relevant backtrace being:
<11> #<SYSTEM-FUNCTION ERROR> <12> #<COMPILED-FUNCTION SYSTEM::CHECK-VALUE> <13> #<SYSTEM-FUNCTION FUNCALL> 1 EVAL frame for form (VALUES (FUNCALL (LOAD-TIME-VALUE (MULTIPLE-VALUE-BIND (CFFI-SYS::FF ERROR) (IGNORE-ERRORS (FFI::FOREIGN-LIBRARY-FUNCTION "SQLAllocHandle" (FFI::FOREIGN-LIBRARY :DEFAULT) NIL NIL (FFI:PARSE-C-TYPE '(FFI:C-FUNCTION (:ARGUMENTS) (:RETURN-TYPE FFI:SHORT) (:LANGUAGE :STDC))))) (OR CFFI-SYS::FF (WARN (FORMAT NIL "~?" (SIMPLE-CONDITION-FORMAT-CONTROL ERROR) (SIMPLE-CONDITION-FORMAT-ARGUMENTS ERROR)))))))) APPLY frame for call (SQL-HANDLE) <14> #<FUNCTION SQL-HANDLE NIL (DECLARE (SYSTEM::IN-DEFUN SQL-HANDLE)) (BLOCK SQL-HANDLE (VALUES (CFFI-SYS:%FOREIGN-FUNCALL "SQLAllocHandle" :SHORT)))> 0 EVAL frame for form (SQL-HANDLE)
Hope this helps tracing out something, tell me if you need anything more.
Thanks, Edgar Gonçalves