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