"card.lemoine" <st_georges@tele.fr> writes:
Pascal Bourguignon a écrit :
Est-on sur que la libgsl est déjà chargée dans clisp?
Pardon je crois que j'ai compris votre question de travers.
Qu'entendez-vous par "déjà chargée" ?
Les dépendances d'une bibliothèque ne sont pas chargées
automatiquement. Il faut les charger explicitement.
Note, j'utilise un chemin absolu dans mon exemple, mais on peut aussi
passer par LD_LIBRARY_PATH:
(setf (ext:getenv "LD_LIBRARY_PATH")
(format nil "/where/my/libs/are:~A" (ext:getenv "LD_LIBRARY_PATH")))
(FFI:DEF-CALL-OUT base-fun (:NAME "base_fun")
(:ARGUMENTS (SIZE FFI:INT :IN))
(:RETURN-TYPE nil)
(:LANGUAGE :STDC)
(:library "libbase.so"))
C/USER[16]> (cat "test.lisp")
(format t ";; -- Loading only libmid.so~%")
(handler-case (FFI:DEF-CALL-OUT mid-fun (:NAME "mid_fun")
(:ARGUMENTS (SIZE FFI:INT :IN))
(:RETURN-TYPE nil)
(:LANGUAGE :STDC)
(:library "/home/pjb/src/lisp/clisp-notes/two-libs/libmid.so"))
(error (err) (princ err)))
(format t ";; -- Loading libbase.so first.~%")
(FFI:DEF-CALL-OUT base-fun (:NAME "base_fun")
(:ARGUMENTS (SIZE FFI:INT :IN))
(:RETURN-TYPE nil)
(:LANGUAGE :STDC)
(:library "/home/pjb/src/lisp/clisp-notes/two-libs/libbase.so"))
(format t ";; -- Then loading libmid.so first.~%")
(FFI:DEF-CALL-OUT mid-fun (:NAME "mid_fun")
(:ARGUMENTS (SIZE FFI:INT :IN))
(:RETURN-TYPE nil)
(:LANGUAGE :STDC)
(:library "/home/pjb/src/lisp/clisp-notes/two-libs/libmid.so"))
(format t ";; -- Now, calling external functions:~%")
(base-fun 42)
(mid-fun 17)
(format t ";; -- Unloading libraries.~%")
(FFI:CLOSE-FOREIGN-LIBRARY "/home/pjb/src/lisp/clisp-notes/two-libs/libmid.so")
(FFI:CLOSE-FOREIGN-LIBRARY "/home/pjb/src/lisp/clisp-notes/two-libs/libbase.so")
C/USER[17]> (load"test.lisp")
;; Loading file test.lisp ...
;; -- Loading only libmid.so
FFI::FIND-FOREIGN-FUNCTION: Cannot open library "/home/pjb/src/lisp/clisp-notes/two-libs/libmid.so": "/home/pjb/src/lisp/clisp-notes/two-libs/libmid.so: undefined symbol: base_fun"
;; -- Loading libbase.so first.
;; -- Then loading libmid.so first.
;; -- Now, calling external functions:
base_fun(42) called.
mid_fun(17) entry.
base_fun(17) called.
mid_fun(17) exit.
;; -- Unloading libraries.
;; Loaded file test.lisp
T
C/USER[18]> (cat "Makefile")
all: libbase.so libmid.so test-c
file libbase.so libmid.so
nm libbase.so
nm libmid.so
test-c:test-c.o
gcc -fPIC -o test-c test-c.o libbase.so libmid.so
test-c.o:test-c.c
gcc -fPIC -shared -o test-c.o test-c.c
base.o:base.c
gcc -fPIC -shared -o base.o base.c
mid.o:mid.c
gcc -fPIC -shared -o mid.o mid.c
libbase.a:base.o
ar cr libbase.a base.o
ranlib libbase.a
libmid.a:mid.o
ar cr libmid.a mid.o
ranlib libmid.a
libbase.so:base.o
gcc -fPIC -shared -Wl,-soname,libbase.so -o libbase.so base.o
libmid.so:mid.o
gcc -fPIC -shared -Wl,-soname,libmid.so -o libmid.so mid.o
clean:
rm -f *.a *.so test-c
C/USER[19]> (cat "base.c")
#include <stdio.h>
extern void base_fun(int i){
printf("base_fun(%d) called.\n",i);
}
C/USER[20]> (cat "mid.c")
#include <stdio.h>
extern void base_fun(int i);
extern void mid_fun(int i){
printf("mid_fun(%d) entry.\n",i);
base_fun(i);
printf("mid_fun(%d) exit.\n",i);
}
C/USER[21]> (cat "test-c.c")
extern void base_fun(int i);
extern void mid_fun(int i);
int main(void){
base_fun(42);
mid_fun(17);
return(0);
}
C/USER[22]>
--
__Pascal Bourguignon__
http://www.informatimago.com/
NEW GRAND UNIFIED THEORY DISCLAIMER: The manufacturer may
technically be entitled to claim that this product is
ten-dimensional. However, the consumer is reminded that this
confers no legal rights above and beyond those applicable to
three-dimensional objects, since the seven new dimensions are
"rolled up" into such a small "area" that they cannot be
detected.