Re: undefined symbol in foreign library
[ Nouvelle discussion
| Répondre au groupe
|
fr.comp.lang.lisp ]
Sujet: Re: undefined symbol in foreign library
De: ...@informatimago.com (Pascal Bourguignon)
Groupes: fr.comp.lang.lisp
Organisation: Informatimago
Date: 24. Apr 2008, 02:41:44
References: 1 2 3 4 5
|
"card.lemoine" <card.lemoine@wanadoo.fr> writes:
> Pascal Bourguignon a écrit :
>> "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.
>>
> Même en faisant coller les codes de votre démo plus près de ma
> situation (ci-dessous), cela se déroule comme comme vous le dites. Et
> pendant près d'un an cela a fonctionné je ne sais comment. Je suis
> éloigné de mes bases toute cette semaine et le début de l'autre. Je
> vous remercie beaucoup et vais essayer de comprendre (ou de
> m'habituer) à ces comportements.
Une solution pourrait être que chaque bibliothèque utilise dlopen pour
charger les sous-bibliothèques qu'elle utilise elle même. Mais c'est
de la programmation C. Je trouverais mieux de le faire en lisp. Note
qu'il suffit de _définir_ un call-out ou une variable, pour que la
bibliothèque spécifiée par :LIBRARY soit chargée. Il n'est pas
nécessaire d'appeler la fonction définie.
On peut donc définir au niveau lisp une dépendance d'une bibliothèque
par la seule donnée d'une paire: nom de la bibliothèque, nom d'une
fonction dans la bibliothèque.
(define-foreign-library bib1 "libbib1.so" "bib1_init"
:depends-on (bib0))
(define-foreign-library bib2 "libbib2.so" "bib2_init"
:depends-on (bib1 bib3))
(define-foreign-library bib3 "libbib3.so" "bib3_init"
:depends-on (bib0))
(define-foreign-library example "libexample.so" "example_init"
:depends-on (bib1 bib2))
et alors:
(load-foreign-library example)
chargerait automatiquement les dépendances en exécutant simplement des
formes:
`(ffi:def-call-out ,(gensym)
(:name ,fun-name)
(:arguments) ; no need, since we won't call it.
(:return-type nil) ; idem
(:language :stdc)
(:library ,lib-name))
dans le bon ordre.
(On pourrait aussi éviter de nommer les bibliothèques avec des
symboles, en utilisant directement le nom "libexample.so", mais comme
ce nom peut changer d'une plateforme à l'autre (eg. "example.dll" sur
MS-Windows), ajouter une indirection permet de d'utiliser
load-foreign-library de façon un peu plus "portable").
--
__Pascal Bourguignon__ http://www.informatimago.com/
"What is this talk of "release"? Klingons do not make software
"releases". Our software "escapes" leaving a bloody trail of
designers and quality assurance people in its wake."

|
 cette fonctionnalité est reservée aux membres ayant une session active !
|