Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme de librairie dynamique

14 réponses
Avatar
Saïd
Bonjour,

Soit deux fichiers C appeles malib.c et monprog.c
malib.c:
---------
extern int reponse;
int demander_a_librairie(void)
{
return reponse;
}
-------

monprog.c:
---------
#include <stdio.h>

int demander_a_librairie(void);
int reponse;

int main(void)
{
reponse=42;
printf("la reponse est %d\n",demander_a_librairie());
}
---------
Sous linux je peux creer une librairie partagee a partir de malib.c

ladjal/kahina - bin/sostuff $ gcc -c -o malib.o malib.c
ladjal/kahina - bin/sostuff $ ld -shared -soname libmalib.so -o libmalib.so
malib.o
ladjal/kahina - bin/sostuff $ gcc -L. -o monprog monprog.c -lmalib
ladjal/kahina - bin/sostuff $ LD_LIBRARY_PATH=. ./monprog
la reponse est 42

Autrement dit libmalib.so connait un symbole qui lui est externe et elle
attend qu'il soit defini par le programme qui l'appelle.

Sous Mac OS X (10.3) je ne peux meme pas creer la libraire libmalib.dylib:
brian-~/bin/sostuff $ gcc -c -o malib.o malib.c
brian-~/bin/sostuff $ gcc -dynamiclib -install_name libmalib.dylib -o
libmalib.dylib malib.o
ld: Undefined symbols:
_reponse
/usr/bin/libtool: internal link edit command failed

Est-ce qu'il y a moyen de creer des librairies qui ne deinissent pas tous
leurs symboles sous Mac OS X? une idee pour contourner le probleme?

Toute aide serait tres appreciable. Merci.

--
Saïd.
C programmers never die - they're just cast into void.

10 réponses

1 2
Avatar
DINH Viêt Hoà

Bonjour,

Soit deux fichiers C appeles malib.c et monprog.c
malib.c:
---------
extern int reponse;
int demander_a_librairie(void)
{
return reponse;
}
-------

monprog.c:
---------
#include <stdio.h>

int demander_a_librairie(void);
int reponse;

int main(void)
{
reponseB;
printf("la reponse est %dn",demander_a_librairie());
}
---------
Sous linux je peux creer une librairie partagee a partir de malib.c

ladjal/kahina - bin/sostuff $ gcc -c -o malib.o malib.c
ladjal/kahina - bin/sostuff $ ld -shared -soname libmalib.so -o libmalib.so
malib.o
ladjal/kahina - bin/sostuff $ gcc -L. -o monprog monprog.c -lmalib
ladjal/kahina - bin/sostuff $ LD_LIBRARY_PATH=. ./monprog
la reponse est 42

Autrement dit libmalib.so connait un symbole qui lui est externe et elle
attend qu'il soit defini par le programme qui l'appelle.

Sous Mac OS X (10.3) je ne peux meme pas creer la libraire libmalib.dylib:
brian-~/bin/sostuff $ gcc -c -o malib.o malib.c
brian-~/bin/sostuff $ gcc -dynamiclib -install_name libmalib.dylib -o
libmalib.dylib malib.o
ld: Undefined symbols:
_reponse
/usr/bin/libtool: internal link edit command failed

Est-ce qu'il y a moyen de creer des librairies qui ne deinissent pas tous
leurs symboles sous Mac OS X? une idee pour contourner le probleme?

Toute aide serait tres appreciable. Merci.


man ld

apparemment, il y a des options concernant la tolérance concernant la
présence de définition symboles ou non.
-weak_reference_mismatches
-weak-lx
-weak_library

--
DINH V. Hoa,

"monde de merde" -- Erwan David

Avatar
Saïd
DINH Viêt Hoà :

man ld

apparemment, il y a des options concernant la tolérance concernant la
présence de définition symboles ou non.
-weak_reference_mismatches
-weak-lx
-weak_library



J'essaye dans tous les sens, mais ca ne donne rien:

brian-~/bin/sostuff $ gcc -dynamiclib -install_name libmalib.dylib -o
libmalib.dylib -weak_library malib.o -weak_reference_mismatches weak
ld: Undefined symbols:
_reponse
/usr/bin/libtool: internal link edit command failed


--
Saïd.
C programmers never die - they're just cast into void.

Avatar
DINH Viêt Hoà

brian-~/bin/sostuff $ gcc -dynamiclib -install_name libmalib.dylib -o
libmalib.dylib -weak_library malib.o -weak_reference_mismatches weak
ld: Undefined symbols:
_reponse
/usr/bin/libtool: internal link edit command failed


hmmm ... tu devrais regarder comment est fait le port de c-client
sur Mac OS X ou Darwin.
Il existe en Darwinport apparemment.

c'est la base commune de UW-IMAP (serveur IMAP) et pine (client mail).
Et il présente ce cas.

Il demande que l'utilisateur de la bibliothèque définisse un certain
nombre de fonction.

--
DINH V. Hoa,

"monde de merde" -- Erwan David

Avatar
lucsky
Saïd wrote:

Toute aide serait tres appreciable. Merci.


% cc malib.c -dynamiclib -flat_namespace -undefined suppress
-o libmalib.dylib
% cc monprog.c -L. -lmalib -o monprog
% ./monprog
la reponse est 42

--
Luc Heinrich -

Avatar
Saïd
Luc Heinrich :
Saïd wrote:

Toute aide serait tres appreciable. Merci.


% cc malib.c -dynamiclib -flat_namespace -undefined suppress
-o libmalib.dylib
% cc monprog.c -L. -lmalib -o monprog
% ./monprog
la reponse est 42



Merci beaucoup.

--
Saïd.
C programmers never die - they're just cast into void.


Avatar
DINH Viêt Hoà

Luc Heinrich :
Saïd wrote:

Toute aide serait tres appreciable. Merci.


% cc malib.c -dynamiclib -flat_namespace -undefined suppress
-o libmalib.dylib
% cc monprog.c -L. -lmalib -o monprog
% ./monprog
la reponse est 42


Merci beaucoup.


Par contre, ce genre de pratiques (bibliothèque qui nécessite des
symboles étant définis dans les programmes utilisant la bibliothèque)
est punie par la loi des développements bien conçus et propre.

--
DINH V. Hoa,

"Ma tuxitude me beastifie" -- sunZ



Avatar
Saïd
DINH Viêt Hoà :

Luc Heinrich :
Saïd wrote:

Toute aide serait tres appreciable. Merci.


% cc malib.c -dynamiclib -flat_namespace -undefined suppress
-o libmalib.dylib
% cc monprog.c -L. -lmalib -o monprog
% ./monprog
la reponse est 42


Merci beaucoup.


Par contre, ce genre de pratiques (bibliothèque qui nécessite des
symboles étant définis dans les programmes utilisant la bibliothèque)
est punie par la loi des développements bien conçus et propre.



Je n'en doute pas, mais ce sur quoi je travaille n'en est pas a ca pres.
;-)


--
Saïd.
C programmers never die - they're just cast into void.




Avatar
twigster
bonjour,

d'abord merci vous avez résolu mes pbs existenciels :)

mais j'ai juste encore une question:

la variable d'env LD_LIBRARY_PATH est-elle utile sous OSX?

merci
Alex
Avatar
DINH Viêt Hoà

d'abord merci vous avez résolu mes pbs existenciels :)

mais j'ai juste encore une question:

la variable d'env LD_LIBRARY_PATH est-elle utile sous OSX?


oui, ça permet de donner au chargeur de bibliothèque les chemins où
trouver les différentes bibliothèques dynamiques.

--
DINH V. Hoa,

"Ma tuxitude me beastifie" -- sunZ

Avatar
twigster
je veux tester dans un script bash si LD_LIBRARY_PATH est définie.

j'ai essayé ca
if [ "${LD_LIBRARY_PATH}" != "" ]; then echo blabla ; fi

mais si elle est pas définie, j'obtient :
-bash: LD_LIBRARY_PATH: unbound variable

et le script plante...

avez-vous une idée?

merci
Alex
1 2