[Avancé] Si vous avez un problème avec libtool lors de la compilation de gtk2.

hello_world

Bon une fois n’est pas coutume, cet article ne contient pas de tuto. En revanche,  voici une astuce pour les utilisateurs avancés de Linux qui auraient envie de recompiler gtk2. Dans de rares occasions, il se peut que même après avoir corrigé tous les warnings du ./configure, vous ayez tout de même un problème lors de la compilation à un endroit où le script libtool est utilisé.

Ce script est généré automatiquement par le ./configure. Mais il contient un léger bug qui fait que dans certains cas, l’utilisation du fichier de versions va retourner une erreur dans le make. Voici la solution que j’ai utilisée pour contourner le problème après avoir un peu fouillé sur le net pour la trouver. Je vous préviens d’avance que ça tient plus de la recette de cuisine qu’autre chose, donc utilisez là à vos riques et périls.

1) Le log de l’erreur:

make[4]: Entering directory `/home/aldian/packages/gtk+-2.14.6/gdk-pixbuf’
/bin/bash ../libtool –mode=link gcc  -DGDK_PIXBUF_DISABLE_DEPRECATED -DG_DISABLE_DEPRECATED -g -O2 -Wall   -o libgdk_pixbuf-2.0.la -rpath /usr/local/lib  -version-info 1400:6:1400 -export-symbols-regex « ^[^_].* »   gdk-pixbuf.lo gdk-pixbuf-animation.lo gdk-pixbuf-data.lo gdk-pixbuf-io.lo gdk-pixbuf-loader.lo gdk-pixbuf-scale.lo gdk-pixbuf-simple-anim.lo gdk-pixbuf-scaled-anim.lo gdk-pixbuf-util.lo gdk-pixdata.lo gdk-pixbuf-enum-types.lo pixops/libpixops.la  -L/usr/local/lib -lgio-2.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lm
libtool: link: rm -fr  .libs/libgdk_pixbuf-2.0.exp .libs/libgdk_pixbuf-2.0.ver
libtool: link: /usr/bin/nm -B  .libs/gdk-pixbuf.o .libs/gdk-pixbuf-animation.o .libs/gdk-pixbuf-data.o .libs/gdk-pixbuf-io.o .libs/gdk-pixbuf-loader.o .libs/gdk-pixbuf-scale.o .libs/gdk-pixbuf-simple-anim.o .libs/gdk-pixbuf-scaled-anim.o .libs/gdk-pixbuf-util.o .libs/gdk-pixdata.o .libs/gdk-pixbuf-enum-types.o   pixops/.libs/libpixops.a | sed -n -e ‘s/^.*[     ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[     ][     ]*\([_A-Za-z][_A-Za-z0-9]*\)$/  /p’ | /bin/sed ‘s/.* //’ | sort | uniq > .libs/libgdk_pixbuf-2.0.exp
libtool: link: /bin/grep -E -e « ^[^_].* » « .libs/libgdk_pixbuf-2.0.exp » > « .libs/libgdk_pixbuf-2.0.expT »
libtool: link: mv -f « .libs/libgdk_pixbuf-2.0.expT » « .libs/libgdk_pixbuf-2.0.exp »
libtool: link: echo « { global: » > .libs/libgdk_pixbuf-2.0.ver
libtool: link:  cat .libs/libgdk_pixbuf-2.0.exp | sed -e « s/\(.*\)/;/ » >> .libs/libgdk_pixbuf-2.0.ver
libtool: link:  echo « local: *; }; » >> .libs/libgdk_pixbuf-2.0.ver
libtool: link:  gcc -shared  .libs/gdk-pixbuf.o .libs/gdk-pixbuf-animation.o .libs/gdk-pixbuf-data.o .libs/gdk-pixbuf-io.o .libs/gdk-pixbuf-loader.o .libs/gdk-pixbuf-scale.o .libs/gdk-pixbuf-simple-anim.o .libs/gdk-pixbuf-scaled-anim.o .libs/gdk-pixbuf-util.o .libs/gdk-pixdata.o .libs/gdk-pixbuf-enum-types.o  -Wl,–whole-archive pixops/.libs/libpixops.a -Wl,–no-whole-archive  -L/usr/local/lib /usr/local/lib/libgio-2.0.so /usr/local/lib/libgobject-2.0.so /usr/local/lib/libgmodule-2.0.so -ldl /usr/local/lib/libglib-2.0.so -lm    -Wl,-soname -Wl,libgdk_pixbuf-2.0.so.0 -Wl,-version-script -Wl,.libs/libgdk_pixbuf-2.0.ver -o .libs/libgdk_pixbuf-2.0.so.0.1400.6
/usr/bin/ld:.libs/libgdk_pixbuf-2.0.ver:2: ignoring invalid character `01′ in script
/usr/bin/ld:.libs/libgdk_pixbuf-2.0.ver:2: syntax error in VERSION script
collect2: ld returned 1 exit status
make[4]: *** [libgdk_pixbuf-2.0.la] Error 1
make[4]: Leaving directory `/home/aldian/packages/gtk+-2.14.6/gdk-pixbuf’

2) La solution:

Puisque c’est le fichier de version qui pose problème, il suffit de dire à libtool de ne pas aller le consulter.

  1. Se placer dans le répertoire principal qui doit s’appeler qqch comme gtk+-2.14.6/ aux variations de version près.
  2. faire une sauvegarde du fichier libtool.
  3. l’éditer
  4. faire une recherche sur les lignes contenant  »-version-script ».
  5. Dans ces lignes, supprimer l’argument contenant cette clé et l’argument suivant.

Par exemple, moi j’avais en ligne 315:

315: \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib »

Que j’ai remplacé par:

315: \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib »

Puis relancer le make, mais ne pas relancer le ./configure, vu que celui-ci régénèrerait le fichier libtool comme la première fois.

Notons pour conclure que le bug ne vient pas forcément du fichier libtool, mais peut être aussi du fichier de version en .ver qui est ignoré grâce à notre petite manipulation smile

Source


Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s