Come installare GCC pezzo per pezzo con GMP, MPFR, MPC, ELF, senza librerie condivise?


115

Come installo GCC (la GNU Compiler Collection) pezzo per pezzo, usando la versione corrente,
usando le versioni corrette delle dipendenze, non usando un gestore di pacchetti (come yum, rpm, apt, dpkg) e non usando le librerie condivise?

Gli sviluppatori tipici probabilmente vorranno installare GCC nel modo tipico, usare il tuo gestore di pacchetti (yum, rpm, apt, dpkg, port, brew, ecc.) O seguire le istruzioni qui ( http://gcc.gnu.org/wiki/ Installazione di GCC ).

La mia domanda è come installare GCC pezzo per pezzo, senza librerie condivise.

  • Voglio un GCC completamente indipendente che possa essere spostato nel mio sistema senza utilizzare librerie condivise e senza creare librerie condivise.
  • Questo è ciò che GCC chiama "la via difficile" e non è raccomandato per gli utenti tipici.

GCC dipende da:

  • GMP: GNU Multiple Precision Arithmetic Library
  • MPFR: GNU Libreria di arrotondamento in virgola mobile a precisione multipla
  • MPC: libreria C GNU a precisione multipla
  • ELF: libreria di formati eseguibili e collegabili
  • PPL: Parma Polyhedra Library (opzionale, per ottimizzazioni della memoria)

Risposte:


123

Il modo più semplice

Se sei uno sviluppatore tipico, puoi installare in modo semplice, usando le istruzioni su http://gcc.gnu.org/wiki/InstallingGCC o il tuo gestore di pacchetti di sistema come:

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

The Hard Way

GCC dice che la risposta qui è "nel modo più difficile" perché costruisce tutto pezzo per pezzo e non utilizza librerie condivise.

Infrastruttura GCC

Ottieni l'infrastruttura GCC:

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

Metti i download in una directory temporanea (puoi usare qualsiasi directory desideri).

/opt/downloads

Crea l'infrastruttura in una directory temporanea diversa dalla directory dei download o dalle sue sottodirectory:

/tmp/gcc

Configura l'infrastruttura utilizzando librerie statiche come questa:

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

Il flag --disable-shared potrebbe valere la pena dare un'occhiata più da vicino a seconda delle tue esigenze. Uso --disable-shared perché sto costruendo solo codice statico e voglio assicurarmi di non creare alcun codice condiviso. La mia necessità è spostare facilmente il GCC risultante tra le mie unità, quindi voglio tutto il codice statico e non voglio alcun codice condiviso. Se preferisci il codice condiviso, ometti il ​​flag --disable-shared.

versioni

Quando esegui uno dei comandi in questa risposta, assicurati di aggiornare i comandi per utilizzare il numero di versione corrente di GCC che corrisponde alle tue esigenze. I comandi in questa risposta sono per GCC 4.6.2.

Si noti che la documentazione di GCC dice: "Mentre qualsiasi versione sufficientemente nuova degli strumenti richiesti di solito funziona, i requisiti della libreria sono generalmente più rigidi. Le versioni più recenti possono funzionare in alcuni casi, ma è più sicuro utilizzare le versioni esatte documentate."

GMP

GMP è la GNU Multiple Precision Arithmetic Library.

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 è la libreria GNU di arrotondamento in virgola mobile a precisione multipla. Dipende da 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 è la libreria C GNU a precisione multipla. Dipende da GMP e 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

ELFO

ELF è l'acronimo di Executable and Linkable Format. Questa libreria fornisce dimensioni indipendenti dall'architettura e supporto 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 è la GNU Compiler Collection. Dipende da GMP, MPFR, MPC ed 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

Compila gcc in una directory di lavoro sullo stesso punto di montaggio. (Costruirlo in / tmp provocherebbe problemi con l'host di compilazione incrociata)

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

Il comando configure e i suoi flag devono essere tutti su una riga di comando (questo post li mostra su righe separate solo a causa della larghezza della pagina web).

Nota: utilizziamo il percorso completo per configurare e non impostiamo le variabili di ambiente del percorso della libreria. Scegliamo di disabilitare il bootstrap e disabilitare le librerie condivise perché non le vogliamo (gli utenti tipici potrebbero volere entrambi), e di usare i thread posix e i flag che sono predefiniti perché li vogliamo (gli utenti tipici potrebbero voler usare altri thread o saltare flag predefiniti). YMMV e leggi le bandiere qui

/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

Questa pagina è ottima per le informazioni sull'installazione di GCC, come costruirlo, vari flag e altro:

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

aggiornamenti

Le librerie ppl possono essere utilizzate per l'ottimizzazione della memoria: vedere bugseng.com/products/ppl/Download (Grazie Paul nei commenti)

È possibile eseguire ./contrib/download_prerequisites dalla directory dei sorgenti di gcc. (Grazie a N7P su reddit)


2
Cordiali saluti, assicurati di aggiornare i numeri di versione sopra per il nuovo GCC 4.6.3 (o qualunque cosa sia attuale quando lo fai)
joelparkerhenderson

12
È possibile eseguire ./contrib/download_prerequisites dalla directory dei sorgenti di gcc. Questo commento è grazie a N7P su Reddit.
joelparkerhenderson

3
No, il bootstrap non dipende da questo. Ha senso utilizzare --disable-shared per la creazione di GMP, MPFR e MPC ma non per GCC stesso (e l'utilizzo dello script download_prerequisites significa che non è necessario compilare GMP, MPFR e MPC comunque manualmente). La compilazione di GCC crea sempre librerie statiche e condivise per impostazione predefinita, --disable-shared significa semplicemente che non si ottengono librerie condivise, che è la scelta sbagliata per la maggior parte delle persone.
Jonathan Wakely

8
--disable-sharedè sbagliato per la maggior parte delle persone, --disable-bootstrappotrebbe velocizzare la compilazione, ma potrebbe causare il fallimento a seconda della versione di gcc esistente, --enable-libgompabilitata di default comunque, --enable-ltoabilitata di default, --enable-thread-safenon un'opzione valida, --enable-threads=posixabilitata di default su alcune piattaforme, non valida su altre , --enable-tlsabilitato per impostazione predefinita, ... fondamentalmente queste istruzioni sono piuttosto scadenti
Jonathan Wakely

1
Puoi usare Linuxbrew per installare gcc (e opzionalmente glibc) nella tua home directory con brew install gcc. Vedi linuxbrew.sh
Shaun Jackman il

118

La risposta accettata lo rende molto più complicato del necessario e non è corretto per tutte le versioni. Costruire GCC con di --disable-sharedsolito è una pessima idea. Vedi http://gcc.gnu.org/wiki/InstallingGCC per un approccio più semplice.

L' intero processo non dovrebbe essere più difficile di questo (sostituire 4.6.2 con la versione che si desidera creare):

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

(Ma per favore leggi comunque il link sopra, contiene informazioni utili.)

Apparentemente alcune persone su Ubuntu hanno tonnellate di schifezze impostate nel loro ambiente che interferiscono con il processo di compilazione di GCC, e devono prima rimuoverle:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH

2
No, non ci sono passaggi mancanti
Jonathan Wakely

2
@ user2023370, GCC sa come trovare tutte le proprie intestazioni e librerie, ovviamente. Devi impostare LD_LIBRARY_PATH per dire al linker dinamico come trovare le librerie (perché quando esegui un GCC eseguibile non è più coinvolto), vedi gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely

2
@einpoklum, allora il tuo "qualcosa di simile" non era lo stesso. I passaggi precedenti funzionano. Funzionano regolarmente per me, con tutte le versioni di GCC. Funzionano per centinaia di persone.
Jonathan Wakely

3
Per riferimento futuro, questo ha funzionato per me per gcc-5.4.0. L'unica cosa che non era menzionato che dovevo unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHprima di tutto come suggerito qui: stackoverflow.com/questions/12255058/...
Cantfindname

4
Questo ha funzionato per me con gcc 6.2.0 e dovrebbe essere sicuramente la risposta accettata! (Funziona su tutti i sistemi operativi / versioni, ecc.)
David Doria

25

Lavoro su un cluster. Solo il nodo master è connesso a Internet. Il software sui nodi è obsoleto e generalmente non viene mantenuto. Non ho accesso come root. Ho due opzioni:

  • costruire software statico di cui ho bisogno (pacchetti computazionali); o
  • costruire compilatori statici.

Ho scelto il secondo e ho creato gcc, g ++ e gfortran.

Ho costruito tutto

PREFIX=$HOME/cmp/soft/sft

e per makeho usato

THREADS=8

Di seguito, gcc è costruito con

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

Si può ottenere l'ultimo gcc da qui: ftp://gcc.gnu.org/pub/gcc/releases

Le dipendenze si trovano qui: ftp://gcc.gnu.org/pub/gcc/infrastructure

dipendenze

Ottengo dipendenze con il seguente script:

#!/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

Di seguito viene utilizzata la seguente funzione bash:

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

Ciascuno dei comandi seguenti deve essere eseguito nella directory della lib appena scaricata.

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

1
Questo è inutilmente complicato, i passaggi nella mia risposta creano anche un GCC collegato staticamente, senza accesso root e non è necessario impostare LD_LIBRARY_PATHper utilizzare il GCC risultante.
Jonathan Wakely

Funziona anche in situazioni in cui ci sono conflitti con tutto ciò che è installato in percorsi "ben definiti" (cioè, casi in cui la procedura standard non funziona completamente). Ultime versioni del 19/06/2017: gmp-6.1.2 mpfr-3.1.5 mpc-1.0.3 isl-0.16.1 cloog-0.18.4 gcc-7.1.0
Michael Goldshteyn

7

Ho usato ciò che ha menzionato Jonathan sopra tranne che ho dovuto scaricare gmp e mpfr manualmente e creare un collegamento software (la distribuzione di gcc 4.4.2 probabilmente non ha "download_prerequisites")

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

A proposito, l'utilizzo di "-with-gmp" e "with-mpfr" con "./configure" mi ha dato "configure: errore: impossibile calcolare il suffisso dei file oggetto: impossibile compilare". Quindi ho scaricato srcs di gmp e mpfr e quindi ho creato il collegamento software da gcc src top leve dir


2

Dopo aver provato a installare le dipendenze GCC tra cui GMP, MPFR e MPC. Mi sono imbattuto in ulteriori requisiti di installazione, errori e file mancanti; come il file di intestazione gmp.h richiesto da MPFR per l'installazione. Ci sono una serie di problemi che incontrerai durante il processo. Tuttavia, esiste un modo più semplice per creare e installare GCC-X.0.0 o versione successiva con un collegamento automatico .

OPZIONE UNO.

Per risparmiare il problema di compilare con make, make install e collegare le librerie dinamiche, semplicemente:

  • Scarica la tua versione GCC-X.0.0 (con l'ultima versione da: https://gcc.gnu.org/ )

  • Estrai i file gcc-X-000.tar.gz in una posizione / somepath /.

  • Dopo aver estratto il file .tar.gz, eseguire lo script ./contrib/download_prerequisites che si trova in / somepath / o nella directory di origine.

  • Questo script scarica librerie di supporto tra cui: GMP, MPFR e MPC e creerà un link simbolici per voi, che vi COSTRUIRE tutte le dipendenze gcc automaticamente come parte del processo di installazione gcc.

    Non c'è bisogno di compilare e collegare le librerie di supporto che sono state scaricate in / somepath / emettendo Make, Make Install o eseguendo il file ./configure o aggiungendo collegamenti come --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... perché questo è stato fatto quando hai eseguito uno script che creava collegamenti simbolici .

OPZIONE DUE.

  • Utilizzare il sistema di gestione dei pacchetti del sistema operativo per installare le librerie di supporto nella posizione del sistema standard. Per i sistemi basati su Debian che includono Ubuntu, installa i pacchetti libgmp-dev, libmpfr-dev e libmpc-dev . Per i sistemi basati su RPM, inclusi Fedora e SUSE, installare i pacchetti gmp-devel e libmpc-devel ( mpc-devel su SUSE).
  • Questa opzione installerà le librerie e i file di intestazione in una directory di sistema standard dove verranno trovati automaticamente durante la creazione di GCC.
  • Questo è il vantaggio della gestione dell'installazione dei pacchetti del sistema operativo quando si richiama "sudo apt-get install libgmp-dev" o "sudo apt-get install libmpfr-dev" l' installazione e il collegamento vengono eseguiti automaticamente. Inoltre, non è necessario creare le librerie di supporto con Make, Make install o ./configure. Inoltre, il processo richiede alcuni minuti per completare l'intero processo.
  • Ora puoi procedere con l'installazione di GCC.

CONFIGURAZIONE:

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

Problema:

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:

--enable-linguaggi come c ++ o c.

--disable-multilib ; disabilita multilib in base al tuo sistema e OS, ti verrà chiesto di multilib per procedere.

Il completamento di Make richiederà molto tempo. Tuttavia, puoi emettere l'opzione -j #no_pro. Questo eseguirà Make contemporaneamente in parallelo in base al numero di processori sul tuo PC o Mac.

Per informazioni dettagliate su come eseguire questo processo è possibile visitare: https://gcc.gnu.org/wiki/InstallingGCC .


1

Ho seguito la risposta più accettata di joelparkerhenderson. Questa è la migliore risposta che ho trovato per l'installazione su un sistema * NIX su Internet.

Per i posteri voglio aggiungere che se ottieni un errore del tipo "errore di installazione: impossibile calcolare il suffisso dei file oggetto: impossibile compilare"

quindi aggiorna il tuo LD_LIBRBARY_PATH con / tmp / gcc / lib (vedi la risposta completa di joelparkerhenderson per il contesto)

/ tmp / gcc / lib contiene tutti i file mpfr / mpc / gmp richiesti, quindi i file e il linker di runtime non possono trovarli a meno che non vengano aggiunti a LD_LIBRARY_PATH. Inoltre, non dimenticare di esportare LD_LIBRARY_PATH;). Più contesto qui: https://gcc.gnu.org/wiki/FAQ#configure_suffix


Dover aggiornare il tuo LD_LIBRARY_PATH solo per usare il compilatore è stupido. Se invece utilizzi stackoverflow.com/a/10662297/981959, non è necessario.
Jonathan Wakely
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.