Lundi, je suis passé de Ubuntu 11.04 (mon installation initiale) à 11.10 et maintenant je ne peux plus compiler gcc à partir du code source. Comme j'avais oublié de désinstaller le paquet gcc avant la mise à jour, Ubuntu a remplacé mon compilateur 4.7.0 par son stable 4.6.1. J'ai donc essayé de construire à nouveau les sources SVN, mais cela a échoué. J'ai récemment essayé avec la révision 180193 de SVN.
Après un certain temps, la construction échoue avec le message suivant:
/home/raphael/devel/gcc/build/./gcc/xgcc -B/home/raphael/devel/gcc/build/./gcc/ -B/usr/i686-pc-linux-gnu/bin/ -B/usr/i686-pc-linux-gnu/lib/ -isystem /usr/i686-pc-linux-gnu/include -isystem /usr/i686-pc-linux-gnu/sys-include -g -O2 -O2 -I. -I. -I../../src/gcc -I../../src/gcc/. -I../../src/gcc/../include -I../../src/gcc/../libdecnumber -I../../src/gcc/../libdecnumber/bid -I../libdecnumber -I../../src/gcc/../libgcc -g -O2 -DIN_GCC -W -Wall -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -I. -I. -I../.././gcc -I../../../src/libgcc -I../../../src/libgcc/. -I../../../src/libgcc/../gcc -I../../../src/libgcc/../include -I../../../src/libgcc/config/libbid -DENABLE_DECIMAL_BID_FORMAT -DHAVE_CC_TLS -DUSE_TLS -o _ashldi3.o -MT _ashldi3.o -MD -MP -MF _ashldi3.dep -DL_ashldi3 -c ../../../src/libgcc/../gcc/libgcc2.c \
-fvisibility=hidden -DHIDE_EXPORTS
In file included from /usr/include/stdio.h:28:0,
from ../../../src/libgcc/../gcc/tsystem.h:88,
from ../../../src/libgcc/../gcc/libgcc2.c:29:
/usr/include/features.h:323:26: fatal error: bits/predefs.h: File or directory not found.
Je l'ai cofiguré avec:
~/devel/gcc/build$ ../src/configure --prefix=/usr --enable-languages=c++
Et le faire avec:
~/devel/gcc/build$ make -j4
Juste pour être sûr, j’ai fait un rm -rf *
dans le répertoire de construction au cas où il y aurait des morceaux cassés à l’intérieur. N'a pas aidé, cependant.
C'est la trame de fond. J'ai essayé de le réparer et j'ai cherché le bits/predefs.h
. C'est à l'intérieur de /usr/include/i386-linux-gnu
. J'ai temporairement résolu le problème en faisant
~/devel/gcc/build$ C_INCLUDE_PATH=/usr/include/i386-linux-gnu make -j4
Ce qui n’est que temporaire car gcc se plaint de ne pas trouver crti.o
.
Que je peux trouver dans /usr/lib/i386-linux-gnu
. Maintenant, je pourrais définir aussi - En fait, ça ne marche pas - mais j'ai l'impression de lutter contre le système ici. De plus, même si cela réussissait, mon compilateur nouvellement construit ne serait pas non plus au courant de la substance C_LIBRARY_PATH
i386-linux-gnu
. Donc, je devrais définir C_LIBRARY_PATH
et C_INCLUDE_PATH
avant chaque construction de chaque projet que j'ai. Je pourrais l'ajouter à mon .bashrc mais cela subvertit le système encore plus.
Alors, comment puis-je dire le processus de construction:
Edit: J'ai oublié d'inclure la commande qui provoque le message d'erreur ci-dessus. Je peux aussi penser à une autre solution: copier le contenu de /usr/include/i386-linux-gnu
vers /usr/include
(même chose pour /usr/lib/i386-linux-gnu
vers /usr/lib
). Mais ça ne va pas non plus. Enfin, le système gcc 4.6.1 du système peut compiler parfaitement d’autres applications, à l’exception de la mienne, qui utilise des fonctionnalités C++ 11 non présentes dans la série 4.6.
Appliquez ce correctif et configurez-le avec --enable-multiarch (à ne pas confondre avec multi lib ):
(Cela remplace ce correctif antérieur .)
Encore du matériel sur:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=644986
Plutôt que d'utiliser l'intégralité du script, l'élément clé semble être:
make FLAGS_FOR_TARGET="-B/usr/lib/i386-linux-gnu -I/usr/include/i386-linux-gnu"
Le résultat n'est pas tout à fait propre car il a toujours besoin d'un script wrapper après l'installation pour s'exécuter avec les options supplémentaires appropriées. Par exemple, voici l'exemple de l'article /usr/bin/gcc-4.7:
#!/bin/sh
exec /opt/gcc-4.7/bin/gcc-4.7 -B/usr/lib/i386-linux-gnu -I/usr/include/i386-linux-gnu "$@"
Ubuntu 11.10 apporte une prise en charge multi-Arch, ce qui signifie que vous ne devriez pas placer de fichiers de bibliothèque dans /usr/lib
, mais bien dans /usr/lib/i386-linux-gnu
(32 bits) ou /usr/lib/x86_64-linux-gnu
(64 bits).
Utilisez quelque chose comme:
CFLAGS=-I/usr/include/i386-linux-gnu ./configure [options]
Vous devrez probablement aussi spécifier LDFLAGS=-L/usr/lib/i386-linux-gnu
.
De plus, vos chemins ne sont pas très jolis: /usr/i686-pc-linux-gnu/lib/
, vous pouvez utiliser des options telles que --libdir
pour le corriger.
Depuis votre bâtiment de SVN, êtes-vous sûr de votre bâtiment de la même révision? AKA, assurez-vous que le problème n'est pas en amont :-)