accès aux groupes de discussion, consultation et publication d'articles, recherche de "newsgroups"...
membres, identifiez-vous
é-mail Mot de passe
nouveau ? mot de passe oublié ?
Chargement... Chargement en cours...

Groupes français belges canadiens suisses internationaux Nétiquette
Échangez opinions et commentaires dans les forums de discussion.

Re: undefined symbol in foreign library

 [  Nouvelle Discussion Nouvelle discussion  |  Répondre au groupe Répondre au groupe  |  fr.comp.lang.lisp ] 

Retour : Accueil du site fr comp lang lisp   charte stats de ce groupe


  Sujet:   Re: undefined symbol in foreign library  
 De: ...@informatimago.com (Pascal Bourguignon)
 Groupes: fr.comp.lang.lisp
 Organisation: Informatimago
 Date: 23. Apr 2008, 01:28:45
 References: 1 2 3
"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.


DateSujet  Auteur
21.04.
* undefined symbol in
card.lemoine@aliceadsl.fr
22.04.
+* Re: undefined symbol in
Pascal Bourguignon
22.04.
|+- Re: undefined symbol in
card.lemoine@aliceadsl.fr
22.04.
|`* Re: undefined symbol in
card.lemoine
22.04.
| +- Re: undefined symbol in
card.lemoine
23.04.
| `*   Re: undefined symbol in
Pascal Bourguignon
24.04.
|  `* Re: undefined symbol in
card.lemoine
24.04.
|   `* Re: undefined symbol in
Pascal Bourguignon
24.04.
|    `* Re: undefined symbol in
card.lemoine
24.04.
|     `- Re: undefined symbol in
Pascal Bourguignon
26.04.
`* Re: undefined symbol in
Pascal Bourguignon
28.04.
 `- Re: undefined symbol in
card.lemoine
Groups Explorer contact votre avis comment ça marche? rechercher un groupe suggérer un groupe abuse accueil du site   Imprimer cette page   Envoyer cette page à un(e) ami(e)