Viva,

On 2/12/07, Luís Oliveira <luismbo@gmail.com> wrote:
On 12/02/07, Edgar Gonçalves <edgar.goncalves@gmail.com> wrote:
> 1) 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.

> 2) 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