Wie installiere ich GCC Stück für Stück mit GMP, MPFR, MPC, ELF ohne gemeinsam genutzte Bibliotheken?

115

Wie installiere ich GCC (die GNU Compiler Collection) Stück für Stück unter Verwendung der aktuellen Version, unter
Verwendung der richtigen Versionen von Abhängigkeiten, ohne Verwendung eines Paketmanagers (wie yum, rpm, apt, dpkg) und ohne Verwendung von gemeinsam genutzten Bibliotheken?

Typische Entwickler möchten GCC wahrscheinlich auf die typische Weise installieren, Ihren Paketmanager verwenden (yum, rpm, apt, dpkg, port, brauen usw.) oder den Anweisungen hier folgen ( http://gcc.gnu.org/wiki/). Installation von GCC ).

Meine Frage ist, wie man GCC Stück für Stück ohne gemeinsam genutzte Bibliotheken installiert.

  • Ich möchte ein vollständig unabhängiges GCC, das ohne Verwendung von gemeinsam genutzten Bibliotheken und ohne Erstellung von gemeinsam genutzten Bibliotheken auf meinem System verschoben werden kann.
  • Dies nennt GCC "den schwierigen Weg" und wird für typische Benutzer nicht empfohlen.

GCC hängt ab von:

  • GMP: GNU Multiple Precision Arithmetic Library
  • MPFR: GNU Gleitkomma-Rundungsbibliothek mit mehrfacher Genauigkeit
  • MPC: GNU C-Bibliothek mit mehrfacher Genauigkeit
  • ELF: Ausführbare und verknüpfbare Formatbibliothek
  • PPL: Parma Polyhedra Library (optional für Speicheroptimierungen)
joelparkerhenderson
quelle

Antworten:

123

Der einfache Weg

Wenn Sie ein typischer Entwickler sind, können Sie die Installation auf einfache Weise anhand der Anweisungen unter http://gcc.gnu.org/wiki/InstallingGCC oder Ihres Systempaket-Managers durchführen, z.

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

Der harte Weg

Laut GCC ist die Antwort hier "der harte Weg", da alles Stück für Stück erstellt wird und keine gemeinsam genutzten Bibliotheken verwendet werden.

GCC-Infrastruktur

Holen Sie sich die GCC-Infrastruktur:

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

Legen Sie Downloads in einem temporären Verzeichnis ab (Sie können jedes gewünschte Verzeichnis verwenden).

/opt/downloads

Erstellen Sie die Infrastruktur in einem temporären Verzeichnis, das sich vom Download-Verzeichnis oder seinen Unterverzeichnissen unterscheidet:

/tmp/gcc

Konfigurieren Sie die Infrastruktur mit statischen Bibliotheken wie folgt:

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

Das Flag --disable-shared kann je nach Ihren Anforderungen einen genaueren Blick wert sein. Ich verwende --disable-shared, weil ich nur statischen Code erstelle und sicherstellen möchte, dass ich keinen gemeinsam genutzten Code erstelle. Ich muss das resultierende GCC einfach auf meinen Laufwerken verschieben, damit ich den gesamten statischen Code und keinen gemeinsam genutzten Code möchte. Wenn Sie gemeinsam genutzten Code bevorzugen, lassen Sie das Flag --disable-shared weg.

Versionen

Wenn Sie einen der Befehle in dieser Antwort ausführen, müssen Sie die Befehle aktualisieren, um die aktuelle GCC-Versionsnummer zu verwenden, die Ihren Anforderungen entspricht. Die Befehle in dieser Antwort beziehen sich auf GCC 4.6.2.

Beachten Sie, dass in der GCC-Dokumentation Folgendes angegeben ist: "Während normalerweise jede ausreichend neue Version der erforderlichen Tools funktioniert, sind die Bibliotheksanforderungen im Allgemeinen strenger. In einigen Fällen funktionieren möglicherweise neuere Versionen, es ist jedoch sicherer, die genauen dokumentierten Versionen zu verwenden."

GMP

GMP ist die 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 ist die GNU-Gleitkomma-Rundungsbibliothek mit mehrfacher Genauigkeit. Es hängt von GMP ab.

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 ist die GNU C-Bibliothek mit mehrfacher Genauigkeit. Dies hängt von GMP und MPFR ab.

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

ELF

ELF steht für Executable and Linkable Format. Diese Bibliothek bietet architekturunabhängige Unterstützung für Größe und 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 ist die GNU Compiler Collection. Dies hängt von GMP, MPFR, MPC und ELF ab.

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

Erstellen Sie gcc in einem Arbeitsverzeichnis auf demselben Einhängepunkt. (Das Erstellen in / tmp würde Cross-Compile-Host-Probleme auslösen.)

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

Der Befehl configure und seine Flags müssen sich alle in einer Befehlszeile befinden (in diesem Beitrag werden sie nur aufgrund der Breite der Webseite in separaten Zeilen angezeigt).

Hinweis: Wir verwenden den vollständigen Pfad, um Umgebungsvariablen für Bibliothekspfade zu konfigurieren und nicht festzulegen. Wir entscheiden uns, Bootstrap zu deaktivieren und gemeinsam genutzte Bibliotheken zu deaktivieren, weil wir sie nicht möchten (typische Benutzer möchten möglicherweise beides), und Posix-Threads und Flags zu verwenden, die Standardwerte sind, weil wir sie möchten (typische Benutzer möchten möglicherweise andere Threads verwenden oder überspringen Standardflags). YMMV und lesen Sie über die Fahnen hier

/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

Diese Seite ist ideal für Informationen zur GCC-Installation, zum Erstellen, zu verschiedenen Flags und mehr:

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

Aktualisierung

Die ppl-Bibliotheken können für Speicheroptimierungen verwendet werden: siehe bugseng.com/products/ppl/Download (Danke Paul in den Kommentaren)

Sie können ./contrib/download_prerequisites aus dem gcc-Quellverzeichnis ausführen. (Danke an N7P auf reddit)

joelparkerhenderson
quelle
2
Zu Ihrer Information: Aktualisieren Sie unbedingt die oben genannten Versionsnummern für das neue GCC 4.6.3 (oder was auch immer aktuell ist, wenn Sie dies tun)
joelparkerhenderson
12
Sie können ./contrib/download_prerequisites aus dem gcc-Quellverzeichnis ausführen. Dieser Kommentar ist N7P auf Reddit zu verdanken.
Joelparkerhenderson
3
Nein, das Bootstrapping hängt nicht davon ab. Es ist sinnvoll, --disable-shared zum Erstellen von GMP, MPFR und MPC zu verwenden, jedoch nicht für GCC selbst (und die Verwendung des Skripts download_prerequisites bedeutet, dass Sie GMP, MPFR und MPC ohnehin nicht manuell erstellen müssen). Beim Erstellen von GCC werden standardmäßig immer statische und gemeinsam genutzte Bibliotheken erstellt. --Disable-shared bedeutet lediglich, dass Sie keine gemeinsam genutzten Bibliotheken erhalten. Dies ist für die meisten Benutzer die falsche Wahl.
Jonathan Wakely
8
--disable-sharedist für die meisten Benutzer falsch, --disable-bootstrapkann den Build beschleunigen, kann jedoch je nach vorhandener gcc-Version zum Fehlschlagen führen, ist --enable-libgompohnehin standardmäßig --enable-ltoaktiviert, standardmäßig aktiviert, --enable-thread-safekeine gültige Option, --enable-threads=posixauf einigen Plattformen standardmäßig aktiviert, auf anderen nicht gültig , --enable-tlsstandardmäßig aktiviert, ... im Grunde sind diese Anweisungen ziemlich schlecht
Jonathan Wakely
1
Sie können Linuxbrew verwenden, um gcc (und optional glibc) in Ihrem Home-Verzeichnis mit zu installieren brew install gcc. Siehe linuxbrew.sh
Shaun Jackman
118

Die akzeptierte Antwort macht es weitaus komplizierter als nötig und ist nicht für alle Versionen korrekt. Das Erstellen von GCC mit --disable-sharedist normalerweise eine sehr schlechte Idee. Eine einfachere Vorgehensweise finden Sie unter http://gcc.gnu.org/wiki/InstallingGCC .

Der gesamte Prozess sollte nicht schwieriger sein (Ersetzen von 4.6.2 durch die Version, die Sie erstellen möchten):

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

(Bitte lesen Sie trotzdem den obigen Link, er enthält nützliche Informationen.)

Anscheinend haben einige Leute auf Ubuntu Tonnen von Mist in ihrer Umgebung, der den GCC-Erstellungsprozess stört, und sie müssen diesen zuerst entfernen:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
Jonathan Wakely
quelle
2
Nein, es fehlt kein Schritt
Jonathan Wakely
2
@ user2023370, GCC weiß natürlich, wie man alle seine eigenen Header und Bibliotheken findet. Sie müssen LD_LIBRARY_PATH festlegen, um dem dynamischen Linker mitzuteilen, wie die Bibliotheken zu finden sind (da beim Ausführen eines ausführbaren GCC nicht mehr beteiligt ist), siehe gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
2
@einpoklum, dann war dein "so etwas" nicht dasselbe. Die obigen Schritte funktionieren. Sie arbeiten regelmäßig für mich mit allen Versionen von GCC. Sie arbeiten für Hunderte von Menschen.
Jonathan Wakely
3
Zum späteren Nachschlagen funktionierte dies für mich für gcc-5.4.0. Das einzige, was nicht erwähnt wurde, war, dass ich unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHvor allem anderen, wie hier vorgeschlagen, musste: stackoverflow.com/questions/12255058/…
Cantfindname
4
Dies funktionierte bei mir mit gcc 6.2.0 und sollte definitiv die akzeptierte Antwort sein! (Es funktioniert über Betriebssysteme / Versionen usw.)
David Doria
25

Ich arbeite an einem Cluster. Nur der Masterknoten ist mit dem Internet verbunden. Die Software auf Knoten ist veraltet und wird im Allgemeinen nicht gewartet. Ich habe keinen Root-Zugriff. Ich habe zwei Möglichkeiten:

  • Ich benötige statische Software (Rechenpakete). oder
  • Erstellen Sie statische Compiler.

Ich entschied mich für die zweite und baute gcc, g ++ und gfortran.

Ich habe alles eingebaut

PREFIX=$HOME/cmp/soft/sft

und für makemich verwendet

THREADS=8

Unten wird gcc mit gebaut

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

Den neuesten gcc erhalten Sie hier: ftp://gcc.gnu.org/pub/gcc/releases

Abhängigkeiten finden Sie hier: ftp://gcc.gnu.org/pub/gcc/infrastructure

Abhängigkeiten

Ich erhalte Abhängigkeiten mit dem folgenden Skript:

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

Die folgende Bash-Funktion wird unten verwendet:

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

Jeder der folgenden Befehle muss im Verzeichnis der gerade heruntergeladenen Bibliothek ausgegeben werden.

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
Adobe
quelle
1
Dies ist unnötig kompliziert. Die Schritte in meiner Antwort erstellen auch ein statisch verknüpftes GCC ohne Root-Zugriff, und Sie müssen nicht festlegen LD_LIBRARY_PATH, dass das resultierende GCC verwendet wird.
Jonathan Wakely
Dies funktioniert auch in Situationen, in denen Konflikte mit dem bestehen, was in "genau definierten" Pfaden installiert ist (dh in Fällen, in denen die Standardprozedur überhaupt nicht funktioniert). Neueste Versionen vom 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

Verwendet, was Jonathan oben erwähnt hat, außer dass ich gmp und mpfr manuell herunterladen und einen Softlink erstellen musste (die gcc 4.4.2-Distribution hat wahrscheinlich keine "download_prerequisites")

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

Übrigens gab die Verwendung von "-with-gmp" und "with-mpfr" mit "./configure" mir "configure: error: Suffix von Objektdateien kann nicht berechnet werden: Kompilieren nicht möglich". Daher habe ich die srcs von gmp und mpfr heruntergeladen und dann den Softlink dazu aus gcc src top leve dir erstellt

vptr
quelle
2

Nach dem Versuch, GCC-Abhängigkeiten wie GMP, MPFR und MPC zu installieren . Ich bin auf zusätzliche Installationsanforderungen, Fehler und fehlende Dateien gestoßen. B. die von MPFR für die Installation erforderliche gmp.h-Headerdatei. Es gibt eine Reihe von Problemen, auf die Sie dabei stoßen werden. Allerdings gibt es einen einfacheren Weg zu bauen und zu installieren GCC-X.0.0 oder später Version mit automatischer Verlinkung .

OPTION EINS.

Um die Probleme beim Erstellen mit make zu vermeiden, müssen Sie die dynamischen Bibliotheken installieren und verknüpfen. Einfach:

  • Laden Sie Ihre GCC-X.0.0-Version herunter (mit der neuesten Version von: https://gcc.gnu.org/ )

  • Extrahieren Sie die Dateien gcc-X-000.tar.gz an einen Speicherort / somepath /.

  • Wenn Sie die Datei .tar.gz extrahiert haben, führen Sie das Skript ./contrib/download_prerequisites aus, das sich im Verzeichnis / somepath / oder im Quellverzeichnis befindet.

  • Dieses Skript Support - Bibliotheken herunterladen einschließlich: GMP, MPFR und MPC und ein erstellen Symlinks für Sie, das wird BUILD alle gcc Abhängigkeiten automatisch als Teil des gcc Installationsprozesses.

    Es ist nicht erforderlich, Unterstützungsbibliotheken zu erstellen und zu verknüpfen , die in / somepath / heruntergeladen wurden, indem Sie Make, Make Install oder die Datei ./configure ausgeben oder Links wie --with-gmp = / gmp_path / ... / ..... hinzufügen. , --with-mpfr = / mpfr_path / ... / ... weil dies getan wurde, als Sie ein Skript ausgeführt haben, das Symlinks erstellt hat .

OPTION ZWEI.

  • Verwenden Sie Ihr OS Package Management-System, um die Support-Bibliotheken am Standard-Systemspeicherort zu installieren. Installieren Sie für Debian-basierte Systeme einschließlich Ubuntu die Pakete libgmp-dev, libmpfr-dev und libmpc-dev . Installieren Sie für RPM-basierte Systeme, einschließlich Fedora und SUSE, die Pakete gmp-devel und libmpc-devel ( mpc-devel on SUSE).
  • Diese Option installiert Bibliotheken und Header-Dateien in einem Standardsystemverzeichnis, in dem sie beim Erstellen von GCC automatisch gefunden werden.
  • Dies ist der Vorteil der OS -Paketinstallationsverwaltung, wenn Sie die Installation "sudo apt-get install libgmp-dev" oder "sudo apt-get install libmpfr-dev" aufrufen und die Verknüpfung für Sie erfolgt. Außerdem müssen Sie die Support-Bibliotheken nicht mit Make, Make install oder ./configure erstellen. Außerdem dauert der Vorgang einige Minuten, um den gesamten Vorgang abzuschließen.
  • Jetzt können Sie mit der GCC-Installation fortfahren.

AUFBAU:

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

Problem:

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-Sprachen wie c ++ oder c.

--disable-multilib ; Wenn Sie Multilib basierend auf Ihrem System und Betriebssystem deaktivieren, werden Sie aufgefordert, mit Multilib fortzufahren.

Das Erstellen von Make wird lange dauern. Sie können jedoch die Option -j #no_pro ausgeben. Dadurch wird Make parallel ausgeführt, basierend auf der Anzahl der Prozessoren auf Ihrem PC oder Mac.

Ausführliche Informationen zum Ausführen dieses Prozesses finden Sie unter: https://gcc.gnu.org/wiki/InstallingGCC .

Juniar
quelle
1

Ich folgte der am besten akzeptierten Antwort von Joelparkerhenderson. Dies ist die beste Antwort, die ich für die Installation auf einem * NIX-System über das Internet finden konnte.

Für die Nachwelt möchte ich hinzufügen, dass, wenn Sie einen Fehler wie "Installationsfehler: Suffix von Objektdateien kann nicht berechnet werden: Kompilieren nicht kompilieren" angezeigt werden.

Aktualisieren Sie dann Ihr LD_LIBRBARY_PATH mit / tmp / gcc / lib (Kontext finden Sie in der vollständigen Antwort von joelparkerhenderson).

/ tmp / gcc / lib enthält alle erforderlichen mpfr / mpc / gmp, sodass Dateien und der Laufzeitlinker sie nur finden können, wenn Sie sie zu LD_LIBRARY_PATH hinzufügen. Vergessen Sie auch nicht, LD_LIBRARY_PATH zu exportieren;). Mehr Kontext hier: https://gcc.gnu.org/wiki/FAQ#configure_suffix

Abhimanu Kumar
quelle
Es ist dumm, LD_LIBRARY_PATH nur zu aktualisieren, um den Compiler zu verwenden. Wenn Sie stattdessen stackoverflow.com/a/10662297/981959 verwenden, ist dies nicht erforderlich.
Jonathan Wakely