Hi Anton, Am 22.10.2012 um 05:28 schrieb Anton Vodonosov <avodonosov@yandex.ru>:
Hello.
The CFFI manual says [1] that cffi:use-foreign-library is intended to be the top-level form used idiomatically to go ahead and load the library.
And most developers follow this idiom.
What makes you think so? I don't.
I would argue that this is inconvenient.
That's what led me to follow a simple two-step idiom: (in-package :de.consequor.app.core) ;;; ------------------------------------------------------------------- ;;; C LIB FFI Definition ;;; ------------------------------------------------------------------- (eval-now! (define-foreign-library CCAGCORE_LIB (t (:default "libccagcore")))) (defparameter *CCAGCORE-DEFAULT-LIBDIR* "Z:/var/data/consequor/swdev/ccagcore/lib/") (defparameter *CCAGCORE-LIBDIR* nil) (defun set-ccagcore-libdir (&optional (libdir *CCAGCORE-DEFAULT-LIBDIR*)) (setq *CCAGCORE-LIBDIR* libdir)) (defun ensure-ccagcore-libdir-set () (unless *CCAGCORE-LIBDIR* (setq *CCAGCORE-LIBDIR* *CCAGCORE-DEFAULT-LIBDIR*))) (defun push-ccagcore-libdir () (pushnew *CCAGCORE-LIBDIR* cffi:*foreign-library-directories* :test #'string=)) (let ((loaded nil)) (defun load-ccagcore-lib () (unless loaded (ensure-ccagcore-libdir-set) (push-ccagcore-libdir) (load-foreign-library 'CCAGCORE_LIB) (setq loaded t) (ccag-log :INFO "LOAD-CCAGCORE-LIB" 0 "CCAGCORE LIB loaded." ))) (defun unload-ccagcore-lib () (when loaded (close-foreign-library 'CCAGCORE_LIB) (setq loaded nil) (ccag-log :INFO "UNLOAD-CCAGCORE-LIB" 0 "CCAGCORE LIB unloaded." ))) (defun ensure-ccagcore-lib-loaded () (unless loaded (load-ccagcore-lib))) ) Simple. Works. No problems on any platform. Cheers Frank