Comment installer GCC morceau par morceau avec GMP, MPFR, MPC, ELF, sans bibliothèques partagées ?

StackOverflow https://stackoverflow.com/questions/9450394

  •  13-11-2019
  •  | 
  •  

Question

Comment installer GCC (la collection de compilateurs GNU) pièce par pièce, en utilisant la version actuelle,
utiliser les versions correctes des dépendances, ne pas utiliser de gestionnaire de packages (comme yum, rpm, apt, dpkg) et ne pas utiliser de bibliothèques partagées ?

Les développeurs typiques voudront probablement installer GCC de la manière habituelle, utiliser votre gestionnaire de paquets (yum, rpm, apt, dpkg, port, Brew, etc.) ou suivre les instructions ici (http://gcc.gnu.org/wiki/InstallingGCC).

Ma question est de savoir comment installer GCC pièce par pièce, sans bibliothèques partagées.

  • Je veux un GCC totalement indépendant qui puisse être déplacé sur mon système sans utiliser de bibliothèques partagées et sans créer de bibliothèques partagées.
  • C'est ce que GCC appelle « la voie difficile » et elle n'est pas recommandée aux utilisateurs typiques.

GCC dépend de :

  • BPF :Bibliothèque arithmétique à précisions multiples GNU
  • MPFR :Bibliothèque d'arrondi à virgule flottante GNU à précision multiple
  • MPC :Bibliothèque C GNU à précision multiple
  • ELFE:Bibliothèque de formats exécutables et pouvant être liés
  • PPL :Bibliothèque Parma Polyhedra (facultatif, pour les optimisations de mémoire)
Était-ce utile?

La solution

le moyen facile

Si vous êtes un développeur typique, vous pouvez installer le moyen facile, en utilisant des instructions sur http:// gcc.gnu.org/wiki/installinggcc ou votre gestionnaire de packages système tel que:

apt  install gcc  # for Debian, Ubuntu, etc.
yum  install gcc  # for RedHat, CentOS, etc.
brew install gcc  # for Mac OS X

la voie difficile

GCC dit que la réponse est "la solution difficile" car elle construit tout le morceau de pièce et n'utilise pas de bibliothèques partagées.

Infrastructure GCC

Obtenez l'infrastructure GCC:

ftp://gcc.gnu.org/pub/gcc/infrastructure/

mettre des téléchargements dans un répertoire temporaire (vous pouvez utiliser n'importe quel répertoire que vous voulez).

/opt/downloads

Construisez l'infrastructure dans un répertoire temporaire différent du répertoire de téléchargements ou de ses sous-répertoires:

/tmp/gcc

Configurez l'infrastructure à l'aide de bibliothèques statiques comme ceci:

./configure --disable-shared --enable-static --prefix=/tmp/gcc

Le drapeau partagé partageable peut valoir une apparence plus proche en fonction de vos besoins. J'utilise --Disable partagée parce que je construise uniquement du code statique, et je veux m'assurer que je ne construis pas de code partagé. Mon besoin est de déplacer le GCC résultant autour de mes lecteurs facilement, alors je souhaite tout le code statique et je ne veux pas de code partagé. Si vous préférez le code partagé, omettez le drapeau partagé --Disable.

Versions

Lorsque vous exécutez l'une des commandes de cette réponse, assurez-vous de mettre à jour les commandes pour utiliser le numéro de version de GCC actuel correspondant à vos besoins. Les commandes de cette réponse sont pour GCC 4.6.2.

Notez que la documentation de la GCC dit: "Bien que toute version suffisamment nouvelle des outils requises fonctionnent généralement, les exigences de la bibliothèque sont généralement plus strictes. Les versions plus récentes peuvent fonctionner dans certains cas, mais il est plus sûr d'utiliser les versions exactes documentées."

GMP

GMP est la bibliothèque arithmétique de précision multiple GNU.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
bunzip2 gmp-4.3.2.tar.bz2
tar xvf gmp-4.3.2.tar
cd gmp-4.3.2
./configure --disable-shared --enable-static --prefix=/tmp/gcc
make && make check && make install

MPFR

MPFR est la bibliothèque de points d'arrondi à virgule flottante à plusieurs précision GNU. Cela dépend de GMP.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
bunzip2 mpfr-2.4.2.tar.bz2
tar xvf mpfr-2.4.2.tar
cd mpfr-2.4.2
./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc
make && make check && make install

MPC

MPC est la bibliothèque C multiple-précision GNU. Cela dépend de GMP et de MPFR.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
tar zxvf mpc-0.8.1.tar.gz
cd mpc-0.8.1
./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc
make && make check && make install

elfe

elfe signifie format exécutable et exécutable. Cette bibliothèque fournit une taille de l'architecture indépendante et un support endian.

wget http://www.mr511.de/software/libelf-0.8.13.tar.gz
tar zxvf libelf-0.8.13.tar.gz
cd libelf-0.8.13
./configure --disable-shared --enable-static --prefix=/tmp/gcc
make && make check && make install

GCC

GCC est la collection GNU Compiler. Cela dépend de GMP, MPFR, MPC et ELF.

wget http://www.netgull.com/gcc/releases/gcc-4.6.2/gcc-4.6.2.tar.gz
tar zxvf gcc-4.6.2.tar.gz

Construire GCC dans un répertoire des rayures sur le même point de montage. (La construction dans / TMP déclencherait des problèmes d'hôte Compiler croisés)

mkdir -p /opt/downloads/gcc-4.6.2-scratch
cd /opt/downloads/gcc-4.6.2-scratch

La commande Configurer et ses indicateurs doivent être toutes sur une ligne de commande (ce message les affiche sur des lignes distinctes simplement en raison de la largeur de la page Web).

Remarque: Nous utilisons le chemin complet pour configurer et ne définir pas les variables d'environnement de chemin de la bibliothèque. Nous choisissons de désactiver les bibliothèques partagées de Bootstrap et de désactiver les bibliothèques partagées, car nous ne voulons pas qu'ils (utilisateurs typiques souhaitaient que) et d'utiliser des threads de POSIX et des drapeaux des valeurs par défaut, car nous les souhaitons (les utilisateurs typiques voudront peut-être utiliser d'autres threads ou ignorer drapeaux par défaut). Ymmv et lisez sur les flags ici

/opt/downloads/gcc-4.6.2/configure
  --disable-shared
  --disable-bootstrap
  --disable-libstdcxx-pch
  --enable-languages=all
  --enable-libgomp
  --enable-lto
  --enable-threads=posix
  --enable-tls
  --with-gmp=/tmp/gcc
  --with-mpfr=/tmp/gcc
  --with-mpc=/tmp/gcc
  --with-libelf=/tmp/gcc
  --with-fpmath=sse
make && make install

Cette page est idéale pour les informations d'installation de GCC, comment le construire, divers drapeaux, et plus encore:

http://www.acsu.buffalo.edu/~charngda/cc_build. HTML

Mises à jour

Les bibliothèques PPL peuvent être utilisées pour optimisations de mémoire: voir Bugseng.com/products/ppl/download (merci Paul dans les commentaires)

Vous pouvez exécuter ./contrib/download_prequisites à partir du répertoire source GCC. (Merci à N7P sur Reddit)

Autres conseils

La réponse acceptée le fait loin plus compliqué que nécessaire et n’est pas correct pour toutes les versions.Construire GCC avec --disable-shared est généralement une très mauvaise idée.Voir http://gcc.gnu.org/wiki/InstallingGCC pour une approche plus simple.

Le entier le processus ne devrait pas être plus difficile que cela (en remplaçant 4.6.2 par la version que vous souhaitez construire) :

tar xzf gcc-4.6.2.tar.gz
cd gcc-4.6.2
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.6.2/configure --prefix=$HOME/GCC-4.6.2 
make
make install

(Mais veuillez quand même lire le lien ci-dessus, il contient des informations utiles.)

Apparemment, certaines personnes sur Ubuntu ont des tonnes de conneries dans leur environnement qui interfèrent avec le processus de construction de GCC, et elles doivent d'abord les supprimer :

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH

Je travaille sur un cluster. Seul le nœud maître est connecté à Internet. Le logiciel sur les nœuds est obsolète et généralement non maintenu. Je n'ai pas d'accès root. J'ai deux options:

  • Construire un logiciel statique dont j'ai besoin (packages de calcul); ou
  • Construire des compilateurs statiques.

    J'ai choisi le deuxième et construit GCC, G ++ et gfortran.

    J'ai tout construit dans

    PREFIX=$HOME/cmp/soft/sft
    

    et pour make j'ai utilisé

    THREADS=8
    

    ci-dessous, GCC est construit avec

    • GMP
    • mpfr
    • MPC
    • isl
    • cloog

      On peut obtenir le dernier GCC d'ici: ftp://gcc.gnu.org/pub / GCC / Communiqués

      Les dépendances sont trouvées ici: ftp://gcc.gnu.org/pub/gcc/infrastructure

      Dépendances

      Je reçois des dépendances avec le script suivant:

      #!/bin/sh
      
      # ===========
      ## variables:
      
      GMP=gmp-4.3.2.tar.bz2
      MPFR=mpfr-2.4.2.tar.bz2
      MPC=mpc-0.8.1.tar.gz
      ISL=isl-0.12.2.tar.bz2
      CLOOG=cloog-0.18.1.tar.gz
      
      MIRROR=ftp://gcc.gnu.org/pub/gcc/infrastructure
      
      
      # ===========
      ## functions:
      
      extract() {
          if [ -f $1 ]; then
              case $1 in
                  *.tar.bz2)   tar xvjf $1    ;;
                  *.tar.gz)    tar xvzf $1    ;;
                  *.bz2)       bunzip2 $1     ;;
                  *.rar)       unrar x $1     ;;
                  *.gz)        gunzip $1      ;;
                  *.tar)       tar xvf $1     ;;
                  *.tbz2)      tar xvjf $1    ;;
                  *.tgz)       tar xvzf $1    ;;
                  *.zip)       unzip $1       ;;
                  *.Z)         uncompress $1  ;;
                  *.7z)        7z x $1        ;;
                  *)           echo "I don't know how to extract '$1'..." ;;
              esac
          else
              echo "'$1' is not a valid file!"
          fi
      }
      
      # ======================
      ## download and extract:
      
      wget $MIRROR/$GMP
      extract $GMP
      
      wget $MIRROR/$MPFR
      extract $MPFR
      
      wget $MIRROR/$MPC
      extract $MPC
      
      wget $MIRROR/$ISL
      extract $ISL
      
      wget $MIRROR/$CLOOG
      extract $CLOOG
      

      La fonction Bash suivante est utilisée ci-dessous:

      mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }
      

      Chacune des commandes ci-dessous doit être émise dans le dir des libérations libérales que de téléchargées.

      GMP
      mkdircd build
      ../configure --disable-shared --enable-static --prefix=$PREFIX/gmp
      make -j $THREADS && make check && make install
      

      MPFR
      mkdircd build
      ../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr
      make -j $THREADS && make install
      

      MPC
      mkdircd build
      ../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc
      make -j $THREADS && make install
      

      ISL
      mkdircd build
      ../configure --with-gmp-prefix=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/isl
      make -j $THREADS && make install
      

      Cloog
      mkdircd build
      ../configure --with-gmp-prefix=$PREFIX/gmp --with-isl-prefix=$PREFIX/isl --disable-shared --enable-static --prefix=$PREFIX/cloog
      make -j $THREADS && make install
      

      GCC
      mkdircd build
      export LD_LIBRARY_PATH=$PREFIX/gmp/lib:$PREFIX/mpfr/lib:$PREFIX/mpc/lib:$PREFIX/isl/lib:$PREFIX/cloog/lib
      export C_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
      export CPLUS_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
      ../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --with-cloog=$PREFIX/cloog --disable-shared --enable-static --disable-multilib --prefix=$PREFIX/gcc --enable-languages=c,c++,fortran
      make -j $THREADS bootstrap && make install
      

Utilisé ce que Jonathan ci-dessus a mentionné, sauf que je devais télécharger manuellement GMP et MPFR et créer Soft Link (GCC 4.4.2 Distribution n'a probablement pas "Download_préquisites")

cd src/gcc-4.4.2
ln -s ~/linux64/gmp-4.2.1  gmp
ln -s ~/linux64/mpfr-2.3.0 mpfr

BTW, en utilisant "-with-gmp" et "with-mff" avec "./configure" m'a donné "configuration: Erreur: impossible de calculer suffixe de fichiers d'objet: impossible de compiler".Par conséquent, j'ai téléchargé les SRC de GMP et MPFR, puis créé le lien Soft à partir de GCC SRC Top Leve Dir

Après avoir essayé d'installer des dépendances de GCC, y compris GMP, MPFR et MPC. J'ai rencontré des exigences d'installation, des erreurs et des fichiers manquants supplémentaires; tels que le fichier d'en-tête GMP.H requis par le MPFR à installer. Il existe un certain nombre de problèmes que vous rencontrerez dans le processus. Cependant, il existe un moyen plus facile de construire et d'installer gcc-x.0.0 ou version ultérieure avec un liaison automatique . .

option une.

Pour enregistrer la peine de bâtiment avec faire, faire installer et relier les bibliothèques dynamiques, simplement:

  • Téléchargez votre GCC-X.0.0 -VERSION (avec la dernière version de: https://gcc.gnu.org / )
  • extraire les fichiers gcc-x-000.tar.gz à un emplacement / quelque path /.
  • Une fois que vous avez extraite le fichier .TAR.GZ, exécutez ./ Script / download_proequisites situé sur / Somepath / ou le répertoire source.
  • Ce script téléchargera les bibliothèques de support, notamment: GMP, MPFR et MPC et créera un symboles pour vous, ce qui sera Construction toutes les dépendances GCC automatiquement dans le cadre du processus d'installation de GCC.

    Nul besoin de construire et de lier des bibliothèques de support téléchargées sur / certainsPath / en émettant marque, créez-la ou exécutant ./ configure fichier ou ajoute des liens tels que - -with-gmp= / gmp_path / ... / ....., --with-mpfr= / mpfr_path / ... / ... Parce que cela a été fait lorsque vous avez exécuté un script qui a créé symboles .

    option deux.

    • Utilisez votre système de gestion de package OS pour installer les bibliothèques de support dans l'emplacement du système standard. Pour le système basé à Debian, y compris Ubuntu, installez libgmp-dev, libmpfr-dev, libmffr-dev de et libmpc-dev paquets. Pour le système basé sur RPM, y compris Fedora et Suse, installez GMP-Devel, et libmpc-devel ( ( mpc-devel sur SUSE).
    • Cette option installera des bibliothèques et des fichiers d'en-tête dans un répertoire système standard où ils seront trouvés automatiquement lors de la construction de GCC.
    • Il s'agit de l'avantage de la gestion d'installation du package OS lorsque vous invoquez "sudo apt-get d'installation libgmp-dev" ou "sudo apt-get d'installation libmpfr-dev" L'installation et la liaison sont effectuées pour vous. En outre, vous n'avez pas à créer les bibliothèques de support avec faire, faire installer ou ./ configure. plus, le processus prend quelques minutes pour compléter tout le processus. .
    • Vous pouvez maintenant continuer à installer avec la GCC.

      configuration:

      This is the GCC config Process, with gcc-X-000.tar.gz 
      

      problème:

      tar -xvf gcc-X-000.tar.gz 
      cd gcc-X-000
      ./contrib/download_prerequisites
      cd ..
      mkdir objdir
      /../gcc-X-000/configure --prefix=$HOME/gcc-X-000 --enable-languages=c,c++,fortran,go --disable-multilib
      make -j 2
      make install
      

      NB:

      - Activer-langues tels que C ++ ou C.

      - Désactiver-multilib ; Désactiver MultiLib basé sur votre système et votre système d'exploitation, vous serez invité à proposer MULTILIB.

      faire prendra longtemps de temps à compléter. Cependant, vous pouvez émettre l'option -j #no_pro. Cela fonctionnera faire simultanément en parallèle basé sur le nombre de processeurs sur votre PC ou Mac.

      Pour des informations détaillées sur la manière d'exécuter ce processus, vous pouvez visiter: https://gcc.gnu.org/wiki/installinggcc .

J'ai suivi la meilleure réponse acceptée de Joelparkerhenderson.C'est la meilleure réponse que je puisse trouver pour l'installation sur un système * Nix sur Internet.

Pour la postérité, je veux ajouter que si vous obtenez une erreur comme "Erreur d'installation: impossible de calculer suffixe de fichiers d'objet: impossible de compiler"

Mettez ensuite à jour votre LD_LIBRBRY_PATH avec / TMP / GCC / LIB (voir la réponse complète de JoElparkerHenderson pour le contexte)

/ TMP / GCC / LIB contient tous les fichiers MPFR / MPC / GMP requis afin que les fichiers de liaison de temps d'exécution recherchent à moins que vous ne les ajoutez à ld_library_path.N'oubliez pas non plus d'exporter ld_library_path;).Plus de contexte ici: https://gcc.gnu.org/wiki/faq#configure_suffix

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top