Coursimault, Jean-marc wrote:
> J'ai un pb d'import d'une lib que je n'arrive pas à résoudre.
>
> Je crée une librairie dynamique (Kdevelop me produit un objet .la, qui
> sera ensuite transformé par libtool en .so).
>
> Cette librairie dynamique importe des classes d'une autre, pas faite
> par moi.
>
> Elles n'arrivent pas à s'entendre (la lib existe, elle semble bien
> contenir la classe qu'il me faut).
A vue de nez: un pb de version de compilateur C++: La librarie C++ A n'a
pas ete compilee avec la meme version de G++ que la librarie B. L'ABI
C++ ayany change entre gcc-2.x & gcc-3.0.x, puis encore avec gcc-3.2.x
(ils se sont calme avec gcc-3.3.x), c'est un souci courant.
> Comment vérifier si ce qui est exporté par une librarie dynamique est
> bien ce qui est attendu par une autre ? (librairie en .la)
"nm -C" (avec demangling C++) ne va malheureusement pas de donner d'info
sur les versions de compilo. Le bon vieux nm (sans demangling, autrement
dit ce qui est _vraiment_ utilise par le linker) va lui t'apprendre si
les symboles qui sont censes se resoudre sont bien les memes.
> nm libicuuc.so (celle dont je veux importer une classe) me donne des
> choses comme
> 0004e3b4 T doCompare__CQ27icu_2_413UnicodeStringiiPCUsii
>
> Par contre, pour explorer les tripes de ma libsummarizer_lib.la ...
> suis un peu sec.
Les fichiers *.la sont des scripts du GNU Linker. Ils sont bien utiles
pour permettre les options --enable-shared , --enable-static, ...etc. de
configure (made by Autoconf). Ils ne sont d'ailleurs actives que avec
--with-gnu-linker => essaie de generer tes libs avec --without-gnu-linker.
> gmake[3]: Entering directory
> `/home/jmcoursi/Summarizer/src/summarizer/summarizer_exe'
> /bin/sh ../libtool --silent --mode=link --tag=CXX g++
> *-Wnon-virtual-dtor -Wno-long-long -Wbad-function-cast -Wundef -Wall
> -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings
> -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion
> -fno-builtin* -g -O2 -O0 -g3 -Wall -fno-exceptions -fno-check-new
> -fexceptions -o summarizer_exe main.o
> ./summarizer_lib/libsummarizer_lib.la
> -L/home/jmcoursi/Summarizer/import/xerces/xerces-c-LINUX-c++-2_2_0/lib
> -lxerces-c -L/usr/lib -licui18n -licuuc -licudata -lpthread -lm
1. Whaou!!! Un code qui passe avec un niveau de warnings aussi
eleves... suffisament rare pour etre applaudi :-)
2. "-ansi -pedantic" est un jeu d'option utilise pour le C pur, dans
ton cas (C++ + GLIBC), AMHA tu as plus interret a utiliser "-ansi
-D_GNU_SOURCE" quand tu es sur Linux.
3. Bugs:
1. "-fno-exceptions -fno-check-new -fexceptions" Les 2
premieres options contradictoires... mais ratrappees par la
3eme. Utilise "-fno-check-new -fexceptions" OU "-fcheck-new
-fexceptions".
2. "-O0 -O2" revient a "-O2"
3. "-g3" (pas toujours Ok) est avantageusement remplace par
"-ggdb" qui laisse a gcc le soin de choisir le format de
debug le plus verbeux reellement disponible sur ta
plateforme (stabs, dwarf, dward2, ...etc.).
A+
--
Francois-Xavier 'FiX' KOWALSKI