Re: Import/export - Kdevelop - ICU

Page principale

Répondre à ce message
Auteur: Francois-Xavier Kowalski
Date:  
À: Coursimault, Jean-marc
CC: 'guilde@imag.fr'
Sujet: Re: Import/export - Kdevelop - ICU
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